إذا كنت تعمل على تطوير موقع أو برنامج وبه خاصية البحث، واحدة من الإمور التي يجب الإهتمام بها هي حساسية الأحرف، مثلا إذا بحث المستخدم عن ' ايثار '، وكانت بقاعدة البيانات مسجلة ' إيثار '، فإنه لن يجدها في عملية البحث وسيتم تجاهلها، وكما نعلم في لغتنا العربية يوجد الكثير من هذه الأمثله مثل ( أ، إ ، ه ، ة ...). لكن ما هي الحلول المتاحة؟
كيفية تجاوز حالة الأحرف في اللغة العربية؟
يوجد العديد من الحلول مثل:
إنشاء custom field لعمليات البحث باللغة العربية.
يتطلب هذا الخيار إنشاء حقل إضافي في قاعدة البيانات، وتتم عملية البحث في هذا الحقل، على سبيل المثال لو كان لدي جدول users وبه id, name، في هذه الحالة يجب إضافة حقل جديد ليكن مثلا بإسم normalized_name.
وعند عملية البحث، يجب أن يتم البحث في هذا الحقل، لكن مع إستخدام دالة لتجاهل الرموز وحساسية الأحرف، هنا سيتم إنشاء دالة لتجاهل الهمزات والتاء المربوطة.
function normalize_name($name) { $patterns = array( "/إ|أ|آ/" ,"/ة/", "/َ|ً|ُ|ِ|ٍ|ٌ|ّ/" ); $replacements = array( "ا" , "ه" , "" ); return preg_replace($patterns, $replacements, $name); }
كما لاحظنا أنه تم إنشاء دالة بإسم normalize_name وهي تأخذ parameter وهي كلمة البحث، ومن ثم يتم البحث عن الهمزات والتاء المربوطة ومن ثم إستخدام دالة preg_replace لإستبدال الهمزات والتاء المربوطة. فعلى سبيل المثال نحصل على النتائج التالية.
normalize_name("إيثار"); // return: ايثار normalize_name("آمنة"); // return: امنه normalize_name("أسامه"); // return: اسامه normalize_name("أسامة"); //return : اسامه normalize_name("مٌحَمَّد"); // return: محمد
لكن نحناج أيضا لإستدعاء هذه الدالة عند عملية الإضافة والتعديل
$user->name=$request->name; $user->normalized_name=normalize_name($request->name);
بالطبع هنا وحتى لا يتم تكرار الدالة في أكثر من مكان يمكن إنشاء helper function.
الأن في عملية البحث نستدعي أيضا هذه الدالة
$user=User::select('name','id') ->when(\request()->name, function ($q){ $q->where('normalized_name','LIKE','%'.normalize_name(\request()->name.'%')); })->get();
هذه الطريقة التي أستخدمها غالبا، وإذا كانت لديكم طرق أخرى يمكن إستخدامها يرجى تركها بالتعليقات حتى يستفيد الجميع.
إقرأ ايضا:
حساسية الأحرف عند البحث في لارافيل باللغة الإنجليزية - Laravel Run Case Sensitive Query Tutorial
بارك الله فيك
واثق الشويطر (Watheq Alshowaiter)
هناك مكتبة https://github.com/khaled-alshamaa/ar-php تفيد في تسوية النصوص \"text normalization\" العربية ..