الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف لا أفرق بين ألف بهمزة وألف بدون همزة عند البحث ... ؟

بدأه هدف الشمالي في 17 يناير 2011 · 24 رد · 4,774 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

الإخوة الفضلاء الحقيقة أن هذه المشكلة أشغلتني , وهي أن البحث في النصوص في الغالب يفقد بعض النتائج المطلوبة ,

فمثلاً إذا كان هناك نصوص في قاعدة بيانات وعملنا برنامج للبحث فيها يحصل التالي :

إذا أجرينا بحث عن كلمة فيها حرف الألف مثل كلمة (أمل) وهي مكتوبة بالقاعدة بدون همزة هكذا (امل) فإنها لن تظهر في نتائج البحث ,

وأيضاً نفس الكلام عن التاء المربوطة والهاء التي في آخر الكلمة .

فهل هناك حل لهذه المشكلة ؟

تم تعديل هذه المشاركة بواسطة .S.T.A.L.K.E.R في 17 يناير 2011 في 12:33

#2

يمكنك مثلا استرجاع مكان الحرف في الكلمة، مثلا الألف، ثم تكتب ال pattern مع وضع مكان الحرف الأكواد unicode التي تريد أن تحتسب مطابقة. مثلا كود الألف بالهمزة هو \u0623 وبدون همزة \u0627

String str = "أمل";
int indexHamza = str.indexOf("\u0623");
if (str.matches(str.substring(0, indexHamza) + "[\u0623\u0627]" + str.substring(indexHamza +1))) {
	System.out.println("match");
} else {
	System.out.println("no match");
}
1
#3

واجهتنى نفس المشكلة مع أوراكل

وكان الحل هو استعمال الدالة replace فانت تعرف الحروف التى تسبب لك مشكلة دائما

مثل ( ي أ ة ) اذا يمكنك الكشف عنها واستبدالها بالحروف القياسية عند الادخال

وايضا عند البحث وبهذا تتطابق القيمتان وتظهر النتائج صحيحة

بالتوفيق


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#4

شاهدت مرة قاعدة بيانات تحتوي على احاديث نبوية

يوجد فيها عمودين

العمود الاول للحديث مع تشكيل

و العمود الثاني للحديث بدون تشكيل و بدون همزة او اي من الحروف التي قد تلبك البحث

---

يتم البحث بتحويل الكلمة الى كلمة دون تشكيل و البحث في العمود الثاني و ارجاع النتيجة المقابلة من العمود الاول

#5

اعتقد بان حل الموضوع في الاستعلام وليس بالجافا.

هذا مثال للاستعلام

SELECT * 
FROM table_name
WHERE cul_name LIKE '%أ%' or cul_name LIKE '%ا%';

يمكنك استشاره قسم SQL للبحث عن استعلام افضل

2
#6
العيافـي كتب:

اعتقد بان حل الموضوع في الاستعلام وليس بالجافا.

هذا مثال للاستعلام

SELECT * 
FROM table_name
WHERE cul_name LIKE '%أ%' or cul_name LIKE '%ا%';

يمكنك استشاره قسم SQL للبحث عن استعلام افضل

شكراً للجميع على المشاركة وبالنسبة لما قلته أخي العيافي ربما هذا هو أقرب الحلول , فقد فكرت في تقسيم

الجملة أو الكلمة المراد الإستعلام عنها حسب حرف الألف مثلاُ بالدالة split وأضع الناتج في مصفوفة نصية ثم أفرغ المصفوفة

في متغير نصي مع إضافة LIKE بين كل قيمة قادمة من المصفوفة, وأضع % لتجاهل ماقبلها ومابعدعها , ولكن هناك عدة مشاكل :

1- يتجاهل الإختلاف في مكان الحرف سواءً ألف مهموزة أو حتى حرف الراء أو أي شيء آخر , وهذه مشكلة .

2- أيضا يتجاهل أي عدد من الحروف وليس حرفاً واحداً فقط.

3 - لابد من تقسيم الجملة مرة أخر بحسب الألف التي عليها مدة ثم الأف المقصورة ثم .........

وضعت موضوع في أحد منتديات قسم قواعد البيانات لعلي أجد حلاً .

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 17 يناير 2011 في 22:29

#7

الحل كما ذكر .S.T.A.L.K.E.R

وهو يسمى نورماليزاشن وهي أن يكون هناك عمودين في الداتا بيز مثلا لو عندنا عمودين في جدول بيانات الشخص للرقم وللاسم يكون شكل الجدول كالتالي

Person Table

PERSON_NO

PERSON_NAME

PERSON_NAME_TRIM

ولما الشخص يدخل بيانات شخص جديد في الشاشة علشان يحفظه في قاعدة البيانات، بتاخد الرقم والاسم من الشاشة تخزن الرقم في العامود الأول والاسم في العامود الثاني

وبعد كدا تاخد الاسم اللي انتا بالفعل خزنته في العمودج الثاني وتمرره على دالة بتعمل التالي

بتبدل أ بـ ا

بتبدل ي بـ ى

بتبدل ة بـ ه

تقوم بحزف جميع المسافات

وهكذا وتخزن الشكل الجديد للاسم في العامود الثالث

وبالتايل انتا لو خزنت "أحمد علي" في قاعدة البيانات ورقمه 1 سيتم التخزين كالتالي

1

أحمد علي

احمدعلى

لاحظ اختفاء المسافة وتحويل حرف الألف والياء

دلوقتي اللي عايز يعمل بحث لو دخل

أحمد علي

أو احمد علي

أو أحمد على

أو احمد على

أو حتى أحمد علي

بتاخد الاسم وتمرره على نفس الدالة اللي انتا بتستخدمها عند الحفظ فبيكون الناتج هو

احمدعلى

انتا جملة الاستعلام بتكون عندك كالتالي

SELECT PERSON_NO, PERSON_NAME FROM PERSON WHERE PERSON_NAME_TRIM ='احمدعلى'

أرجو أن تكون الإجابة واضحة

وأي استفسار أنا جاهز

تم تعديل هذه المشاركة بواسطة prog_omer في 18 يناير 2011 في 19:52

2
#8
prog_omer كتب:

الحل كما ذكر .S.T.A.L.K.E.R

وهو يسمى نورماليزاشن وهي أن يكون هناك عمودين في الداتا بيز مثلا لو عندنا عمودين في جدول بيانات الشخص للرقم وللاسم يكون شكل الجدول كالتالي

Person Table

PERSON_NO

PERSON_NAME

PERSON_NAME_TRIM

ولما الشخص يدخل بيانات شخص جديد في الشاشة علشان يحفظه في قاعدة البيانات، بتاخد الرقم والاسم من الشاشة تخزن الرقم في العامود الأول والاسم في العامود الثاني

وبعد كدا تاخد الاسم اللي انتا بالفعل خزنته في العمودج الثاني وتمرره على دالة بتعمل التالي

بتبدل أ بـ ا

بتبدل ي بـ ى

بتبدل ة بـ ه

تقوم بحزف جميع المسافات

وهكذا وتخزن الشكل الجديد للاسم في العامود الثالث

وبالتايل انتا لو خزنت "أحمد علي" في قاعدة البيانات ورقمه 1 سيتم التخزين كالتالي

1

أحمد علي

احمدعلى

لاحظ اختفاء المسافة وتحويل حرف الألف والياء

دلوقتي اللي عايز يعمل بحث لو دخل

أحمد علي

أو احمد علي

أو أحمد على

أو احمد على

أو حتى أحمد علي

بتاخد الاسم وتمرره على نفس الدالة اللي انتا بتستخدمها عند الحفظ فبيكون الناتج هو

احمدعلى

انتا جملة الاستعلام بتكون عندك كالتالي

SELECT PERSON_NO, PERSON_NAME FROM PERSON WHERE PERSON_NAME_TRIM ='احمدعلى'

أرجو أن تكون الإجابة واضحة

وأي استفسار أنا جاهز

طيب إذا كان المدخل نص طويل صفحة كاملة مثلا ًسيكون الحل غير مرضي على الأقل بالنسبة لي .

#9

لو اعتمدت على الحل فى sql فستفقد خاصية ال reusability اعادة الاستخدام

لان كل قاعدة بيانات لها دوال مختلفة لحل هذه المشكلة

وماذا لو اردت استخدام هذا الحل مع HQL وهى مختلفة عن sql ؟

ارى ان الحل داخل برنامجك

انسخ هذه الفئة فى برنامجك

/**
 * This class made to help developers to handle Arabic strings with database
 * operations like Insert , Search
 * 
 * @author Mohammed Fathei
 * @version 1.0
 */
public class ArabicFilter {
 /*
  * an array represents Arabic letters and their against standard characters
  */
 private final static String arabicChars[][] = { 
  	{ "أ", "ا" },
  	{ "اٍ", "ا" },
  	{ "ة", "ه" }, 
  	{ "ى", "ي" },
  	{ "ـ",  ""}
  };

 /**
  * this method receive arabic text with different characters that may cause
  * problems with database handling and apply filter on it to be valid and
  * better for this purpose .
  * 
  * @param arabicText
  *        	a string to apply filters on it like replacing
  *        	<code>'أ'</code> and <code>'اٍ'</code> with <code>'ا'</code>
  *        	and so on .
  * @return the arabic text entered after applying filter and ready to use
  *     	with database .
  */
 public static String encodeArabicText(String arabicText) {
  /*
   * check if the string is empty
   */
  if ((arabicText.isEmpty()) || (arabicText.trim().length() == 0)) {
   return "";
  }

  int length = arabicText.length();
  StringBuffer encodedText = new StringBuffer(2 * length);
  encodedText.append(arabicText);

  int location = -1;

  for (int i = 0; i < arabicChars.length; i++) {
   while ((location = getLocationOfString(arabicChars[0],
     encodedText)) >= 0) {
    encodedText.replace(location,
      (location + arabicChars[0].length()),
      arabicChars[1]);
   }
  }

  return encodedText.toString();
 }

 /*
  * this method search the given StringBuffer for a specified string
  * 
  * @param subString a string to search for .
  * 
  * @param container a stringBuffer object to search in it .
  * 
  * @return the first index of the stringBuffer substring that matches the
  * string search for it or -1 if not found .
  */
 private static int getLocationOfString(String subString,
   StringBuffer container) {
  int location = 0;
  try {
   location = container.indexOf(subString);
   return location;
  } catch (Exception e) {
   System.err.println(e.getMessage());
   return -1;
  }
 }

 public static void main(String args[]) {
  String txt = "مةحأمد أحـــــــــــــــمأداٍى";

  System.out.println(ArabicFilter.encodeArabicText(txt));
 }

}

انت لديك فئة تتعامل مع قاعدة البيانات ولتكن DbsClass

public class DbsClass{

public void insertEmployee(int id,String name,double sal){

String ename = ArabicFilter.encodeArabicText(name);

sql = "insert into emp values("+ id +",' " ename " '  ," + sal ")";

........

.........

}

public Employee getEmployee(String name){
String ename = ArabicFilter.encodeArabicText(name);

sql = "select * from emp where emp.name=' " + ename + " ' ";

......

.....


}

}

يمكنك تجربة الحل

بالتوفيق


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#10

لو المشكلة في المساحة ممكن تخزن بس عمود واحد في قاعدة البيانات وتعمل

stored procedure

or

function

على مستوى قاعدة البيانات، وبالتالي هيكون شكل الاستعلام كالتالي

SELECT PERSON_NO, PERSON_NAME FROM PERSON WHERE ENCODE(PERSON_NAME) ='احمدعلى'

ويبقى بس في البرنامج الجزء اللي انتا هتدور بيه هو اللي هتحوله للصيغة العامة

وهتلاقي فيه على الانترنت ألجورزمات كثير تتكلم عن كيفية عمل هذا لان الكلام داه معمول في الأوراكل بالفعل فيه دالة بتقوم بهذه المهمة ولكن المشكلة انها شغالة على الانجليزي

#11

الأخ MOHAMED FATHEI أشكرك على الإبداع الذي سطرته في ردك , فقد قمت بتجريب الفئة ArabicFilter

ومررت لها النص التالي "أمجد أحمد أشرف"

فأعطاني المخرج التالي (امجد احمد اشرف) يعني تم حذف أي حرف ألف بهمزة واستبدلها بألف بدون همزة وهذا جيد , ولكن هل هذا هو الإحتمال الوحيد ؟

الجواب لا , بل هناك عدة إحتمالات أخرى كالتالي :

أمجد احمد اشرف

أمجد أحمد اشرف

امجد أحمد اشرف

امجد أحمد أشرف

امجد احمد أشرف

طبعاً هذا في النص الذي يحتوي على ثلاث حروف فيها ألف بهمزة , ولكن إن كان النص يحتوي على أكثر من 3 ستكون الإحتمالات أكثر طبعاً .

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 20 يناير 2011 في 08:34

1
#12

اولا اشكرك على مجاملتك الرقيقة

ثانيا انا لم اطلب منك ان تجربها بنص معين مثل "أمجمد أحمد أشرف"

أنا قلت جربها وتركت لك حرية التجربة

طبعا كلامك صحيح عن الاحتمالات ولكن قبل ان تعرضها كنت جربها وجرب غيرها أيضا

الفئة تقوم بالدوران داخل النص واستبدال الحرف أ مثلا بالحرف ا فقط حتى لو كان موجودا ل 20 مرة او اكثر وليس مرة واحدة فقط

على كل قمت باضافة بعض الحروف و اضافة test case واليك الفئة

package arabic;
/**
 * This class made to help developers to handle Arabic strings with database
 * operations like Insert , Search
 * 
 * @author Mohammed Fathei
 * @version 1.0
 */
public class ArabicFilter {
 /*
  * an array represents Arabic letters and their against standard characters
  */
 private final static String arabicChars[][] = { 
  	{ "أ", "ا" },
  	{ "إ", "ا" },
  	{ "آ", "ا" },
  	{ "اٍ", "ا" },
  	{ "ة", "ه" }, 
  	{ "ى", "ي" },
  	{ "ـ",  "" }
  };

 /**
  * this method receive arabic text with different characters that may cause
  * problems with database handling and apply filter on it to be valid and
  * better for this purpose .
  * 
  * @param arabicText
  *        	a string to apply filters on it like replacing
  *        	<code>'أ'</code> and <code>'اٍ'</code> with <code>'ا'</code>
  *        	and so on .
  * @return the arabic text entered after applying filter and ready to use
  *     	with database .
  */
 public static String encodeArabicText(String arabicText) {
  /*
   * check if the string is empty
   */
  if ((arabicText.isEmpty()) || (arabicText.trim().length() == 0)) {
   return "";
  }

  int length = arabicText.length();
  StringBuffer encodedText = new StringBuffer(2 * length);
  encodedText.append(arabicText);

  int location = -1;

  for (int i = 0; i < arabicChars.length; i++) {
   while ((location = getLocationOfString(arabicChars[0],
     encodedText)) >= 0) {
    encodedText.replace(location,
      (location + arabicChars[0].length()),
      arabicChars[1]);
   }
  }

  return encodedText.toString();
 }

 /*
  * this method search the given StringBuffer for a specified string
  * 
  * @param subString a string to search for .
  * 
  * @param container a stringBuffer object to search in it .
  * 
  * @return the first index of the stringBuffer substring that matches the
  * string search for it or -1 if not found .
  */
 private static int getLocationOfString(String subString,
   StringBuffer container) {
  int location = 0;
  try {
   location = container.indexOf(subString);
   return location;
  } catch (Exception e) {
   System.err.println(e.getMessage());
   return -1;
  }
 }

 public static void main(String args[]) {
  String txt[] = {"مةحأمد أحــــــــمأداٍى","أمجد أحمد اشرف","امجد أحمد اشرف","امجد أحمد أشرف","اٍمجد آحمد أشــــــــرف"};

	for(int i=0; i< txt.length; i++){
    	System.out.println(ArabicFilter.encodeArabicText(txt) + "\n");
	}

 }

}

لاحظ اسم الحزمة arabic package

جربها كيفما تشـــــــــــــــــــــــاء

بالتوفيق


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#13

أستاذ محمد أعتقد ان المشكلة عندك انك ستفقد الطريقة التي أدخل بها المستخدم الاسم

فمثلا لو المستخدم أدخل الاسم كالتالي

أحمد أشرف

هيتخزن في قاعدة البيانات كالتالي

احمد اشرف

وبالتالي لما المستخدم يحب يعرض قائمة بأسماء الموظفين هيلاقي ان الاسماء كلها مختلفة عن اللي هو دخلها ووارد جدا انه ما يكونش مقبول عنده

علشان كدا كنت بقترح ان يكون في عامودين في قاعدة البيانات واحد يحتفظ بالشكل اللي المستخدم دخله، وواحد علشان البحث

#14

البحث يكون بكل الاحتملات مثل

أحمد

احمد

او بالحذف اذا اردت مثل

حمد

تم تعديل هذه المشاركة بواسطة bo0oda في 21 يناير 2011 في 00:04

With method and logic one can accomplish anything.

— Agatha Christie, Poirot Investigates, 1924

مدونتى

#15

الصراحة أن الحل باستخدام or مع like نوعاً ما فظيع

بالنسبة للحلول القائلة بالتكرار ب وبدون

تؤدي إلى خسارة كبيرة في المساحة

أنا أرجح حل محمد

لكني أرجحه بالطريقة التالية

الدالة encodeArabicText

تقوم بإرجاع array من العناصر أو list تحتوي جميع الاحتمالات

بعدها يقوم المستخدم بوضع بالتعامل معها في sql على النحو التالي

select * from employee where emp_name in {my list}

على كل أظن أن هناك حدود للـ list في SQL لذا على من يستخدمها أن يعرف ما الحدود

من يتبرع ويجهز هذه الآلية في حزمة مفصولة

الصراحة أنها تقوم بحل مشاكل كبيرة وكثيرة في البحث العربي

إن لم يكن هناك متبرعين من اليوم إلى الأحد القادم فسأكون أن المتبرع بإذن الله

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#16

أبشركم - إن شاء الله - وجدت الحل , نزل المرفقات ولي عودة إن شاء الله للشرح ................

newpackage1.7z

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 21 يناير 2011 في 20:04

#17

إخواني الكرام الآن يوجد في الحزمة فئة إسمها Bhth

الفئة بها دالتين (select و Comparison) :

دالة select : هذه الدالة تستقبل منك النص الذي تريد البحث عنه وتقوم بتجهيز الشرط بحيث تجعله يتجاهل وجود "أ" و"إ" و "ا" و "ى" و"آ" و " ئ " ,

ينتهي دور الدالة هذه على ذلك , وأنت عليك بإكمال وضعها بأمر البحث sql المناسب وهو select واسم الجدول وما إلا ذلك , وبعد أن تحصل على نتيجة الإستعلام يأتي دور الدالة Comparison

دالة Comparison : تستقبل نصين :

الأول من اليسار هي الناتج الذي حصلت عليه من الدالة select الموجودة في فئتنا Bhth ,

الثاني ناتج الإستعلام الذي تحصل عليه من قاعدة البيانات ,

هذه الدالة تقارن بين النصين فإن كانت النتيجة مطابقة تماماً أو لايوجد فرق بينهما إلا الحروف "أ" و"إ" و "ا" و "ى" و"آ" و " ئ " ترجع لك القيمة true أي أن هذه النتيجة صالحة لعرضها للمستخدم .

وإن كان يوجد بين النصين فرق أكثر غير "أ" و"إ" و "ا" و "ى" و"آ" و " ئ " فإنها ترجع القيمة false بمعنى أن النتيجة لاتصلح أن تعرض للمستخدم .

وأخيرا يوجد بالحزمة أيضاً Frame للإختبار وهو ليس مجهز للإتصال بقاعدة البيانات ولكن وضعت به متغيرين نصيين عليك أن تعتبرهما كأنهما قادمان من القاعدة نتيجة إستعلامك ,

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 21 يناير 2011 في 20:19

#18
هدف الشمالي كتب:

إخواني الكرام الآن يوجد في الحزمة فئة إسمها Bhth

اخى الكريم

هل جربت ذلك

    	String str3 = "احمد اشرف عامر";
    	String str2 = "أحمد أشرف عأمر";
    	String str4 = "احمد اشرف عإمر";

او

String str3 = "احمد اشرف عامر";
    	String str2 = "أحمد أشرف عأمر";
    	String str4 = "احمد آشرف عإمر";

وقس على ذلك

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 21 يناير 2011 في 18:47

Software Developer
Mahmoudkelany.com


 

#19

أخي محمود الفئة التي أرفقتها تعمل على حرفين فقط وهما الألف الذي فوقه همزة والألف التي ليس عليها شيء

وقد قمت بتعديل دالة select لتشمل الحروف التالية "أ" و"إ" و "ا" و "ى" و"آ" و " ئ ":

قم بحذف دالة select التي عندك واستبدالها بالتالي :

    public String select(String jmlh){

      String s="";
      String[] words = jmlh.split("ا");
         for(int i=0;i<words.length;i++){
           s =s+" "+words;
            }
      // ================
           words = s.split("أ");
           s="";
         for(int i=0;i<words.length;i++){
              s =s+" "+words;
            }
      //=================
            words = s.split("آ");
           s="";
         for(int i=0;i<words.length;i++){
              s =s+" "+words;
            }
      //=================
            words = s.split("إ");
           s="";
         for(int i=0;i<words.length;i++){
              s =s+" "+words;
            }
      //=================
            words = s.split("ئ");
           s="";
         for(int i=0;i<words.length;i++){
              s =s+" "+words;
            }
      //=================
            words = s.split("ى");
           s="";
         for(int i=0;i<words.length;i++){
              s =s+" "+words;
            }
      //=================

        words = s.split(" ");
          s="";
          for(int i=0;i<words.length;i++){
              if(words.equals("")){
              }else{
             s =s+"LIKE '%"+words+"%' AND ";
            s=s.substring(0,s.length()-5);
            }
          }
      return s;
    }

ملاحظة : قمت بتعديل الردود والمرفق بعد هذا التعديل

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 21 يناير 2011 في 20:08

#20
هدف الشمالي كتب:

أخي محمود الفئة التي أرفقتها تعمل على حرفين فقط وهما الألف الذي فوقه همزة والألف التي ليس عليها شيء

وقد قمت بتعديل دالة select لتشمل الحروف التالية "أ" و"إ" و "ا" و "ى" و"آ" و " ئ "

اخى الكريم

الداله تعمل بشكل جميل

لكن عندما تطبع الكلمه فى الاخر تجد انه حذف كل الحروف الذى تقوم بعمل splite عليها

وبالتالى هتكون الكلمه كدا

حمد شرف عمر

هل هذه ستأثر على البحث ؟؟؟؟

وانا عدلت الكود بتاعك بس هو نفس المبدا بس باستخدام مبادئ الـ OOP

/**
 *
 * @author DELL
 * @author Mahmoud Kelany , As Developer
 * 
 */
public class ArabicSearch {

	private static String ARABIC_LETTERS[] = {"ا", "أ", "آ", "إ", "ئ", "ى"};

	private static String splitWithLetter(String[] splits) {
    	StringBuffer word = new StringBuffer();
    	for (int i = 0; i < splits.length; i++) {
        	word.append(splits);
    	}
    	return word.toString();
	}

	private static String prepareWord(String word) {
    	for (int i = 0; i < ARABIC_LETTERS.length; i++) {
        	word = splitWithLetter(word.split(ARABIC_LETTERS));
    	}
    	return word;
	}

	public static boolean compare(String searchWord, String storedWord) {
    	return prepareWord(storedWord).equals(prepareWord(searchWord));
	}
}

لكن اعتقد ان الكود الخاص بالاخ محمد فتحى

مناسب لانه لا يزيل الحروف

بالتوفيق :)

Software Developer
Mahmoudkelany.com


 

#21

سأحاول الشرح بطريقة أخرى ياأخ محمود ,

أخي إفرض أنك تستعلم عن (احمد اشرف )

سيتم إرسال (حمد شرف) ولا يهتم بأي شيء يقع بين الكلمتين ولا ماقبل ومابعد,

وبناءاً عليه إذا كان موجود في القاعدة الجملتين التاليتين (أحمد أشرف) و (أحمد مشرف) سيجلبهما الإستعلام ,ولكن الكود في الدالة الثانية

يختبر مابين الكلمتين بطريقة معينة فإن كان فقط "أ" أو "ا" أو "ى" ....إلخ فإنه لا يستبعد هذه النتيجة وذلك عن طريق إرجاع القيمة true

وإن كان الذي بينهما غير الحروف المذكورة سترجع false ,

لذلك فإن الكود سيخبرك أن جملة (أحمد أشرف) جملة مطلوبة وأما (أحمد مشرف ) جملة غير مطلوبة وغير صالحة للعرض على المستخدم .

جميل النقاش معك فقد لاحظت أن جملة (حمد شرف )سيعتبرها جملة مطلوبة ولكن تدارك هذا الخطأ أظنه سهل وبإمكان من فهم

الكود تعديل الدالة Comparison بحيث تستبعدها .

المهم الخطوة الأصعب وهي عدم التفريق بين الحروف المذكورة قد تم , إذا شاء الله سأضع التعديل المطلوب .

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 22 يناير 2011 في 01:03

#22

الصراحة أن الحل المقدم هنا جيد نوعاً ما

إلا أنه جيد لو كنا نتكلم عن قاعدة بيانات محلية وليست على الشبكة

لأن كميات البيانات الراجعة لك ستكون مهولة جداً

وتحتاج إلى وقت كبير في عملية الفلترة وتحديد البيانات الصالحة للعرض

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#23

اخى الكريم

انت طلبت مثلا

احمد اشرف

وهى فى قاعده البيانات بالشكل التالى

أحمد أشرف

وانت كما قولت

اقتباس
سيتم إرسال (حمد شرف) ولا يهتم بأي شيء يقع بين الكلمتين ولا ماقبل ومابعد,

وبناءاً عليه إذا كان موجود في القاعدة الجملتين التاليتين (أحمد أشرف) و (أحمد مشرف) سيجلبهما الإستعلام

ولكن اذا كان هناك شخص

يدعى

محمد شرف 
او 
محمد اشرف

فكيف يتم ذلك

وانت لم تطلب الشخص الذى يبدا بحرف الـميم

Software Developer
Mahmoudkelany.com


 

#24

الرجل يعتم على Like يا محمود

فهو يقوم بتكرار الكلمات مع like و %

بالمناسبة وجدت حل يقلل القيم الراجعة من الخادم ألا وهو استبدال الحرف المختلف على أمره بالعلامة التالية _

العلامة تعني أي حرف يغطي هنا

ثم تقوم بعملية الفلترة

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#25
علاء الصالحي كتب:

الرجل يعتم على Like يا محمود

فهو يقوم بتكرار الكلمات مع like و %

بالمناسبة وجدت حل يقلل القيم الراجعة من الخادم ألا وهو استبدال الحرف المختلف على أمره بالعلامة التالية _

العلامة تعني أي حرف يغطي هنا

ثم تقوم بعملية الفلترة

تحياتي

أخي محمود الأمر كما قال الأستاذ علاء ,

وبالنسبة للعلامة _ فهي مفاجأة بكل معنى الكلمة ياأستاذ , إن شاء الله سأجربها ولكن غير هذه الليلة ,

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…