فحص وجود كلمة في نص PHP: ما الذي يحدث تحت الغطاء؟

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: السؤال الذي يقلق كل مطور PHP

\n\n

تخيل الموقف: أنت تكتب كود PHP وتحتاج إلى التحقق مما إذا كان النص يحتوي على كلمة معينة. قد يبدو الأمر بسيطًا، لكن عندما تتصفح Stack Overflow، ستجد أن هذا السؤال حصد آلاف المشاهدات وعشرات الإجابات. يختلط الأمر على المطورين بين استخدام strpos و preg_match، ويقعون في أخطاء تتعلق بحالة الأحرف والتشفير. اليوم، لن نقدم لك إجابة جاهزة فقط — بل سننظر تحت غطاء PHP ونفهم كيف تعمل هذه الدوال بالفعل. هل أنت مستعد؟ لنبدأ!

\n\n

الطريقة التقليدية: strpos والمزالق الخفية

\n\n

الإجابة الأكثر شيوعًا على Stack Overflow هي استخدام strpos. هذه دالة مدمجة في PHP تبحث عن موضع أول ظهور لنص فرعي. لكن هناك مشكلة: المبتدئون غالبًا ما يكتبون بهذا الشكل:

\n\n
$string = "مرحبًا بالعالم!";\n$word = "العالم";\nif (strpos($string, $word)) {\n    echo "تم العثور على الكلمة!";\n} else {\n    echo "لم يتم العثور على الكلمة!";\n}\n
\n\n

وهذا يعمل... حتى تكون الكلمة في بداية النص. لماذا؟ لأن strpos تُرجع الموضع (رقم)، وإذا كانت الكلمة في الموضع 0، فإن PHP تفسر 0 على أنها false في شرط if. الطريقة الصحيحة هي:

\n\n
if (strpos($string, $word) !== false) {\n    echo "تم العثور على الكلمة!";\n}\n
\n\n

كيف تعمل strpos تحت الغطاء؟

\n\n

عند استدعاء strpos، تستخدم PHP داخليًا خوارزمية البحث عن النص الفرعي. في الإصدارات الحديثة من PHP (7.x و 8.x)، يتم تطبيق خوارزمية محسّنة تعتمد على خوارزمية Boyer-Moore-Horspool. هذه الخوارزمية لا تكتفي بفحص الأحرف واحدًا تلو الآخر، بل تستخدم جدول "الأحرف الخاطئة" لتخطي كتل كاملة من النص إذا لم يتطابق الحرف مع الكلمة المطلوبة. هذا يجعل البحث سريعًا جدًا، خاصة مع النصوص الطويلة.

\n\n

لكن هناك قيد: strpos حساسة لحالة الأحرف. "العالم" و "العالم" (مع اختلاف حالة الحرف الأول) تعتبر كلمتين مختلفتين. إذا كنت بحاجة إلى بحث غير حساس لحالة الأحرف، استخدم stripos — النسخة المكافئة التي تتجاهل حالة الأحرف.

\n\n

الطريقة الحديثة: str_contains (PHP 8.0+)

\n\n

بدءًا من PHP 8.0، ظهرت الدالة المنتظرة str_contains. تحل هذه الدالة مشكلة strpos بشكل نهائي. بدلاً من التحقق من الموضع، تقوم ببساطة بإرجاع true أو false:

\n\n
$string = "مرحبًا بالعالم!";\n$word = "العالم";\nif (str_contains($string, $word)) {\n    echo "تم العثور على الكلمة!";\n}\n
\n\n

ما الذي يحدث داخل str_contains؟

\n\n

تحت الغطاء، str_contains هي مجرد غلاف لـ strpos. تستدعي نفس دالة البحث الداخلية، لكن النتيجة تُحوّل تلقائيًا إلى قيمة منطقية. هذا يجعل الكود أنظف وأكثر أمانًا. لكن إذا كنت تعمل مع إصدارات PHP قديمة (7.4 أو أقل)، فلن تكون str_contains متاحة — ستحتاج إلى استخدام strpos مع التحقق !== false.

\n\n

أداة قوية: التعبيرات المنتظمة مع preg_match

\n\n

أحيانًا تحتاج إلى التحقق ليس فقط من وجود كلمة، بل من مجموعة كاملة من الكلمات أو نمط معين. هنا يأتي دور preg_match. التعبيرات المنتظمة تمنحك قوة خارقة: يمكنك البحث عن كلمات كاملة (بحيث لا تتطابق "عالم" مع "عالمي")، وتجاهل حالة الأحرف، والبحث باستخدام حدود الكلمات، وغير ذلك الكثير.

\n\n
$string = "مرحبًا أيها العالمي!";\n$word = "عالم";\nif (preg_match("/\\b" . preg_quote($word, '/') . "\\b/ui", $string)) {\n    echo "تم العثور على الكلمة!";\n} else {\n    echo "لم يتم العثور على الكلمة!";\n}\n
\n\n

هنا، \\b هو حد الكلمة، والعلامة u تفعّل دعم Unicode (لضمان عمل الأحرف العربية بشكل صحيح). العلامة i تجعل البحث غير حساس لحالة الأحرف. دالة preg_quote تقوم بإخفاء الرموز الخاصة، إذا

المدونات

توصيات الكتب