لارافيل, Others / 2024-10-18

حساسية الأحرف عند البحث باللغة العربية في لارافيل - مع همزة أو بدون

حساسية الأحرف عند البحث باللغة العربية في لارافيل - مع همزة أو بدون

2024-10-18 وقت القراءه : 1 دقائق

إذا كنت تعمل على تطوير موقع أو برنامج وبه خاصية البحث، واحدة من الإمور التي يجب الإهتمام بها هي حساسية الأحرف، مثلا إذا بحث المستخدم عن ' ايثار '، وكانت بقاعدة البيانات مسجلة ' إيثار '، فإنه لن يجدها في عملية البحث وسيتم تجاهلها، وكما نعلم في لغتنا العربية يوجد الكثير من هذه الأمثله مثل ( أ، إ ، ه ، ة ...). لكن ما هي الحلول المتاحة؟

كيفية تجاوز حالة الأحرف في اللغة العربية؟

يوجد العديد من الحلول مثل:

  • تغيير نوع قاعدة البيانات من خلال إنشاء custom collection ولكن هذا يتطلب أن يتم ذلك من مدير السيرفر، ويمكن الإطلاع عليها من هنا.
  • إستخدام Regular Expression ، لكن قد تتسبب ببعض البطئ في عملية البحث.
  • إنشاء custom field وهو الحل الذي سيتم التطرق له في المقالة.


إنشاء 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\" العربية ..

Eslam Gamal
منذ سنة

بارك الله فيك

إضافة تعليق
Loading...