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

الدالة preg_match() في PHP: التعابير النمطية مع أمثلة

تختبر preg_match($pattern, $subject, $matches) نصًا مقابل تعبير نمطي وتعيد 1 عند التطابق و0 عند عدمه. تعلّم مجموعات الالتقاط، والمجموعات المسماة، وpreg_match_all، والمرتكزات، وأنماط التحقق، والمعدّل u لنصوص UTF-8 والنصوص اليابانية.

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

تتحقق preg_match($pattern, $subject, $matches) من أن نصًا يطابق تعبيرًا نمطيًا. تعيد 1 عند التطابق و0 في غير ذلك، وتملأ $matches بما وجدته: تعيد preg_match('/\d+/', 'Order 4521 shipped', $m) القيمة 1 وتضبط $m[0] على "4521".

النمط نص حوله محددات، عادة /.../، تليها معدّلات مثل i. اكتب الأنماط بين علامتي تنصيص مفردتين: داخل المزدوجتين توسّع PHP أولًا $name وتسلسلات الهروب مثل \x41 أو \101، فقد يتلقى محرك التعابير النمطية نمطًا مختلفًا عن الذي كتبته.

مجموعات الالتقاط

تلتقط الأقواس في النمط جزء النص الذي تطابقه. $m[0] هو التطابق كله، و$m[1] المجموعة الأولى، و$m[2] الثانية، معدودة حسب القوس الافتتاحي من بداية النمط.

المجموعات المسماة

يعطي (?<name>...) المجموعة اسمًا. تُخزَّن القيمة تحت الاسم وتحت رقمها، فلا تنكسر الشيفرة التي تقرأ النتيجة عندما يضيف أحدهم مجموعة في موضع أسبق من النمط.

إيجاد كل تطابق بـ preg_match_all

تواصل preg_match_all() البحث بعد التطابق الأول وتعيد عدد التطابقات. افتراضيًا تحمل $m[0] كل التطابقات الكاملة و$m[1] كل قيم المجموعة الأولى. ومع PREG_SET_ORDER تحصل بدلًا من ذلك على مصفوفة لكل تطابق، وهذا أسهل في المرور عليه.

التحقق من المُدخلات: المرتكزات وأرقام الهواتف والرموز البريدية

للتحقق يجب أن يطابق النمط النص كله، لذا ابدأه بـ ^ وأنهِه بـ $. وهنا فخ: يطابق $ أيضًا ما قبل سطر جديد أخير، لذا يقبل '/^\d+$/' النص "123\n". أضف المعدّل D، أو استخدم \z، الذي لا يطابق إلا عند النهاية الفعلية.

مع عناوين البريد الإلكتروني، إما أن يرفض التعبير النمطي عناوين صالحة أو يقبل عناوين غير صالحة. استخدم filter_var($email, FILTER_VALIDATE_EMAIL) بدلًا منه (راجع filter_var()).

المعدّل u لنصوص UTF-8 والنصوص اليابانية

دون المعدّل u، يعمل النمط على البايتات. والمحرف الياباني ثلاثة بايتات في UTF-8، لذا يطابق . ثلث محرف وتخرج الأطوال خاطئة. ومع u، يعمل النمط على المحارف ويمكنك استخدام فئات خصائص Unicode.

يتحقق u أيضًا من النص: إذا لم يكن النص UTF-8 صالحًا، تعيد preg_match() القيمة false بدل المطابقة.

تهريب مُدخلات المستخدم بـ preg_quote

لمحارف مثل . و+ و? و( و/ معانٍ خاصة في النمط. إذا جاء جزء من النمط من متغير، مثل مصطلح بحث، فمرّره عبر preg_quote() مع المحدد وسيطًا ثانيًا، وإلا طابق 1+1 النص 11 وكسرت / غير المهرّبة النمط.

لا يرمي النمط غير الصالح استثناءً. تطبع PHP تحذيرًا وتعيد preg_match() القيمة false:

Warning: preg_match(): No ending delimiter '/' found in /path/to/index.php on line 3

لذا افحص === false (أو preg_last_error_msg()) عندما يُبنى النمط وقت التشغيل. وللتحقق البسيط من نص جزئي دون أي نمط، تكون str_contains() أسرع وأوضح. ولتغيير النص الذي طابقته، استخدم preg_replace().

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

ماذا تعيد preg_match في PHP؟

1 إذا تطابق النمط، و0 إذا لم يتطابق، وfalse إذا كان النمط نفسه غير صالح. ولأن 0 وfalse كلتيهما خاطئة منطقيًا، قارن بـ === 1 عندما تحتاج إلى التمييز بين نمط فاشل وعدم وجود تطابق.

كيف أحصل على النص المطابق من preg_match؟

مرّر وسيطًا ثالثًا: preg_match('/(\d+)/', 'Order 4521', $m). عندها تكون $m[0] التطابق كله و$m[1] مجموعة الالتقاط الأولى، وكلتاهما "4521" هنا. ومع مجموعة مسماة (?<id>\d+) تكون القيمة أيضًا في $m['id'].

ما الفرق بين preg_match وpreg_match_all؟

تتوقف preg_match() عند أول تطابق. وتجد preg_match_all() كل تطابق، وتعيد عدد ما وجدته، وتملأ $matches بها كلها: تعيد preg_match_all('/\d+/', 'a1 b22 c333', $m) القيمة 3 وتكون $m[0] هي ["1", "22", "333"].

كيف أستخدم preg_match مع النصوص اليابانية أو نصوص UTF-8 الأخرى؟

أضف المعدّل u: تعيد preg_match('/^.{3}$/u', '日本語') القيمة 1. دون u، تعامل PHP النص على أنه بايتات، فيطابق . بايتًا واحدًا من محرف طوله 3 بايتات. ومع u يمكنك أيضًا استخدام فئات Unicode مثل \p{Han} و\p{Hiragana} و\p{Katakana}.

كيف أتحقق من أن نصًا يحتوي أرقامًا فقط في PHP؟

preg_match('/^\d+$/D', $s) أو، دون تعبير نمطي، ctype_digit($s). للمعدّل D (أو \z بدل $) أهمية: تقبل $ العادية أيضًا سطرًا جديدًا ختاميًا، فيمر "123\n".

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

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

ابدأ الآن