shammaa / laravel-arabic-search
High-performance Arabic search and matching library for Laravel with flexible regex, diacritics removal, and Eloquent integration
Requires
- php: ^8.1|^8.2|^8.3|^8.4
- illuminate/database: ^9.0|^10.0|^11.0|^12.0
- illuminate/support: ^9.0|^10.0|^11.0|^12.0
Requires (Dev)
- orchestra/testbench: ^8.0|^9.0|^10.0
- phpunit/phpunit: ^10.0|^11.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
حزمة احترافية ومتقدمة للبحث الذكي والمرن في النصوص العربية لتطبيقات لارافيل.
A high-performance, flexible Arabic search and text-matching library for Laravel with Eloquent macros, model traits, diacritics removal, and multi-database support.
🌟 المميزات الرئيسية | Features
- مطابقة مرنة لجميع أشكال الحروف العربية (Interchangeable Characters):
- الألف:
[أ، إ، آ، ا، ٱ] - التاء المربوطة والهاء:
[ة، ه، ۀ] - الياء والألف المقصورة والنبرة:
[ي، ى، ئ، ی] - الواو المهموزة والواو:
[ؤ، و] - الكاف العربية والفارسية:
[ك، ک]
- الألف:
- إزالة التشكيل والكشيدة تلقائياً (Tashkeel & Tatweel Removal):
- تجريد الحركات (فتحة، ضمة، كسرة، سكون، تنوين، شدة...).
- إزالة الكشيدة (ـ) (Tatweel/Kashida).
- دعم مدمج للـ Eloquent Query Builder:
User::whereArabic('name', 'احمد')->get();User::orWhereArabic('bio', 'مهندس')->get();
- Trait جاهز للـ Models (
SearchableArabic):- بحث في حقول متعددة وعلاقات Model (
category.name) بسطر واحد: Post::searchArabic($keyword)->paginate();
- بحث في حقول متعددة وعلاقات Model (
- ماكرو للـ Collections:
$collection->whereArabic('title', 'فاطمه');
- دعم متعدد لقواعد البيانات (Cross-Database Compatibility):
- MySQL / MariaDB: عبر مشغل
REGEXP. - PostgreSQL: عبر مشغل POSIX
~*. - SQLite: تسجيل تلقائي لدالة
REGEXPفي PDO لضمان عمل الاختبارات (Unit Tests) بسلاسة فائقة دون أي أخطاء!
- MySQL / MariaDB: عبر مشغل
- تطبيع النصوص السريع (Normalization):
- دالة
ArabicSearch::normalize($text)لتجهيز الأعمدة المفهرسة (Indexed Shadow Columns).
- دالة
- ميزة تجاهل "الـ" التعريف اختيارياً (Ignore "ال" Prefix):
- مطابقة "كتاب" مع "الكتاب" والعكس.
📦 التثبيت | Installation
يمكنك تثبيت الحزمة عبر Composer:
composer require shammaa/laravel-arabic-search
إذا كنت تستخدم ميزة الـ Package Discovery في Laravel، فسيتم تسجيل الـ ServiceProvider والـ Facade تلقائياً.
نشر ملف الإعدادات (اختياري) | Publish Config (Optional)
php artisan vendor:publish --tag="arabic-search-config"
سينتج الملف config/arabic-search.php.
🚀 طريقة الاستخدام | Usage
1. الاستعلام المباشر عبر Eloquent | Direct Eloquent Query
تستطيع استخدام الماكرو whereArabic أو orWhereArabic مباشرة على أي استعلام:
use App\Models\User; // البحث عن "احمد" سيطابق: أحمد، احمد، إحمد، آحمد $users = User::whereArabic('name', 'احمد')->get(); // دمج شروط متعددة $products = Product::where('status', 'active') ->whereArabic('name', 'مؤسسة') // يطابق مؤسسة وموسسه ->orWhereArabic('description', 'هندسة') ->paginate(15);
2. استخدام الـ Trait في الموديل | Using Model Trait
أضف الـ Trait SearchableArabic إلى الموديل وحدد الحقول القابلة للبحث:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Shammaa\LaravelArabicSearch\Traits\SearchableArabic; class Article extends Model { use SearchableArabic; // الحقول المشمولة في البحث (تدعم العلاقات أيضاً!) protected array $searchableArabic = [ 'title', 'content', 'category.name', // بحث في جدول التصنيفات المرتبط ]; }
ثم نفّذ البحث بكل بساطة في الـ Controller:
public function search(Request $request) { $query = $request->input('q'); return Article::searchArabic($query)->paginate(20); }
يمكنك أيضاً تمرير حقول محددة أثناء الاستعلام:
Article::searchArabic('حلب', ['title', 'summary'])->get();
3. استخدام الـ Collection Macro
إذا كانت لديك مجموعة بيانات في الذاكرة (Collection):
$collection = collect([ ['id' => 1, 'name' => 'أحمد إبراهيم'], ['id' => 2, 'name' => 'محمد علي'], ['id' => 3, 'name' => 'فاطمة الزهراء'], ]); // سيعيد السطر الأول $results = $collection->whereArabic('name', 'ابراهيم'); // سيعيد السطر الثالث (يطابق التاء المربوطة والهاء) $fatima = $collection->whereArabic('name', 'فاطمه');
4. استخدام الـ Facade مباشرة | Facade Helpers
use Shammaa\LaravelArabicSearch\Facades\ArabicSearch; // 1. توليد Regex نمطي مرن $regex = ArabicSearch::toRegex('أحمد'); // النتيجة: [أإآاٱ]حمد // 2. فحص مطابقة نص في الذاكرة $matched = ArabicSearch::matches('مُؤَسَّسَةُ النُّورِ', 'موسسه النور'); // true // 3. تطبيع نص كامل (مفيد لإنشاء أعمدة مفهرسة في قاعدة البيانات) $clean = ArabicSearch::normalize('إِعْلَانٌ عَنْ وَظِيفَةٍ'); // النتيجة: اعلان عن وظيفه // 4. إزالة التشكيل أو الكشيدة $text = ArabicSearch::stripTashkeel('سَلَامٌ عَلَيْكُمْ'); // سلام عليكم $clean = ArabicSearch::stripTatweel('مـحـمـد'); // محمد
5. خيارات وأوضاع البحث المتقدمة | Search Modes & Options
تستطيع تمرير مصفوفة خيارات للدوال:
// مطابقة مطابقة تامة (Exact Match) User::whereArabic('username', 'احمد', 'and', ['mode' => 'exact'])->first(); // يبدأ بـ (Starts with) User::whereArabic('name', 'عبد', 'and', ['mode' => 'starts_with'])->get(); // تجاهل "الـ" التعريف (البحث عن 'كتاب' يجد 'الكتاب' والعكس) Product::whereArabic('title', 'كتاب', 'and', ['ignore_al_prefix' => true])->get();
⚙️ ملف الإعدادات | Configuration
محتوى ملف config/arabic-search.php:
return [ // نمط البحث الافتراضي: 'contains', 'exact', 'starts_with', 'ends_with' 'mode' => 'contains', // قواعد مطابقة الحروف المتبادلة 'interchangeable' => [ 'alef' => true, // أ, إ, آ, ا, ٱ 'taa_marbouta' => true, // ة, ه, ۀ 'yaa' => true, // ي, ى, ئ, ی 'waw' => true, // ؤ, و 'kaf' => true, // ك, ک ], // إزالة الحركات والكشيدة 'strip_tashkeel' => true, 'strip_tatweel' => true, // التعامل المرن مع المسافات المتعددة 'flexible_spaces' => true, // تجاهل "الـ" التعريف 'ignore_al_prefix' => false, ];
🧪 تشغيل الاختبارات | Running Tests
تم بناء الحزمة وتغطيتها بالكامل باختبارات Unit و Feature باستخدام Orchestra Testbench:
composer test
🤝 المساهمة | Contributing
المساهمات مرحب بها دائماً! لا تتردد في فتح Issue أو إرسال Pull Request.
📄 الترخيص | License
هذه الحزمة مرخصة تحت رخصة MIT License. المؤلف: شادي شماع (Shadi Shammaa).