Menu
flag Ar iconالعربيةdown icon

الدالة strpos() في PHP: إيجاد موضع نص جزئي

تعيد strpos($haystack, $needle) موضع أول ظهور لـ $needle، أو false إذا لم يُوجد. تعلّم فحص !== false، وstripos غير الحساسة لحالة الأحرف، وآخر تطابق بـ strrpos، وإيجاد كل مرات الظهور.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تعيد strpos($haystack, $needle) موضع أول $needle داخل $haystack، معدودًا من 0، أو false إذا لم يكن موجودًا. اختبر النتيجة دائمًا بـ !== false، لأن التطابق في البداية يعيد 0.

إذا لم تكن تحتاج إلا إلى إجابة بنعم أو لا في PHP 8، فإن str_contains() أوضح. واستخدم strpos() عندما يهم الموضع.

الصيغة

strpos(string $haystack, string $needle, int $offset = 0): int|false

البحث حساس لحالة الأحرف. وتخبرها $offset من أين تبدأ البحث؛ والإزاحة السالبة تُعدّ من نهاية النص.

فخ !== false

القيمتان 0 وfalse متساويتان في المقارنة المرنة (==). لذا يُعامل التطابق في الموضع 0 على أنه «غير موجود» في أي فحص غير صارم.

تنطبق القاعدة نفسها على stripos() وstrrpos() وarray_search()، التي قد تعيد كلها 0 لتطابق حقيقي.

البحث دون حساسية لحالة الأحرف بـ stripos

تأخذ stripos() الوسائط نفسها وتتجاهل حالة حروف ASCII.

إيجاد آخر ظهور بـ strrpos

تعيد strrpos() موضع آخر تطابق. وهي الطريقة المعتادة للحصول على امتداد ملف أو آخر جزء من مسار.

لأسماء الملفات تحديدًا، تفعل pathinfo($file, PATHINFO_EXTENSION) ذلك نيابة عنك. وقطع النص عند الموضع مشروح في صفحة substr().

بدء البحث من إزاحة

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

إيجاد كل مرات الظهور

تجد strpos() تطابقًا واحدًا. استخدم حلقة وحرّك الإزاحة بعد كل تطابق لتجدها كلها:

العدد فقط؟ substr_count($text, 'the') أقصر. وللأنماط، تعيد preg_match_all() مع PREG_OFFSET_CAPTURE كل تطابق مع موضعه.

النصوص اليابانية: موضع البايت مقابل موضع المحرف

تجد strpos() النص متعدد البايتات بشكل صحيح، لكن العدد الذي تعيده بالبايتات. يأخذ كل محرف من الكانا والكانجي الشائع 3 بايتات في UTF-8، لذا يكون موضع البايت في نص ياباني خالص ثلاثة أضعاف موضع المحرف، وفي النص المختلط يتباعد الاثنان بطرق أقل وضوحًا. تعيد mb_strpos() المحارف، وهذا ما تتوقعه mb_substr().

الخلط بينهما خطأ كلاسيكي: تمرير نتيجة strpos() إلى mb_substr() يبدأ من موضع أبعد مما يجب في النص. استخدم strpos مع substr، وmb_strpos مع mb_substr.

الأسئلة الشائعة

ماذا تعيد strpos() في PHP؟

موضع أول تطابق عددًا صحيحًا، يُعدّ من 0، أو false إذا لم يُوجد النص المبحوث عنه. تعيد strpos('hello', 'l') القيمة 2.

لماذا أحتاج إلى !== false مع strpos()؟

لأن التطابق في البداية تمامًا يعيد 0، و0 == false صحيحة. تعامل if (strpos($s, 'a')) التطابق في الموضع 0 على أنه "غير موجود". قارن دائمًا بـ strpos($s, 'a') !== false.

ما الفرق بين strpos وstripos وstrrpos؟

تجد strpos() أول تطابق وهي حساسة لحالة الأحرف. وتجد stripos() أول تطابق متجاهلة حالة الأحرف. وتجد strrpos() آخر تطابق. وتجد strripos() آخر تطابق متجاهلة حالة الأحرف.

هل أستخدم strpos أم str_contains للتحقق من أن نصًا يحتوي نصًا آخر؟

في PHP 8 استخدم str_contains($haystack, $needle)، التي تعيد true أو false بسيطة ولا فخ فيها للموضع 0. واستخدم strpos() عندما تحتاج إلى الموضع نفسه.

كيف أستخدم strpos مع النصوص اليابانية؟

تجد strpos() النص الياباني بشكل صحيح لكنها تعيد موضعًا بالبايتات. إذا مررت الموضع إلى mb_substr() أو عرضته على مستخدم، فاستخدم mb_strpos()، التي تعيد الموضع بالمحارف.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن