English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، ستتعلم كيف تعمل العبارات النمطية وكيف تستخدمها بشكل فعال في PHP للتنسق مع النماذج.
تُسمى العبارات النمطية عادةً بـ regex أو RegExp ، هو نص نصي بتنسيق خاص يستخدم للبحث عن نماذج في النص. العبارات النمطية هي واحدة من أدوات القوة المتاحة اليوم، يمكنها معالجة وتعديل النصوص بشكل فعال. على سبيل المثال، يمكن استخدامها لتحقق من صحة تنسيق البيانات المدخلة من قبل المستخدم (مثل الاسم، البريد الإلكتروني، الرقم الهاتفي وما إلى ذلك)، البحث أو استبدال النصوص التي تتطابق مع النمط، وما إلى ذلك.
PHP (الإصدار 5.3 وأعلى) يدعم العبارات النمطية بأسلوب Perl من خلال سلسلة funcions preg_.لغة استخراج وتقارير عمليةهو اللغة البرمجية الشائعة الأولى التي توفر دعمًا مدمجًا للعبارات النمطية، وتشتهر بدعمها القوي للعبارات النمطية ووظائف معالجة وتعديل النصوص المتميزة.
在深入探讨正则表达式世界之前,让我们首先简要介绍一下常用的PHP内置模式匹配功能。
函数 | 描述 |
---|---|
preg_match() | 执行正则表达式匹配。 |
preg_match_all() | 执行全局正则表达式匹配。 |
preg_replace() | 执行正则表达式搜索并替换。 |
preg_grep() | 返回与模式匹配的输入数组的元素。 |
preg_split() | 使用正则表达式将字符串拆分为子字符串。 |
preg_quote() | 引用在字符串中找到的正则表达式字符。 |
注意: PHP preg_match()函数在找到第一个匹配项后将停止搜索,而preg_match_all()函数将继续搜索直到字符串的末尾并找到所有可能的匹配项,而不是在第一个匹配项处停止。
正则表达式语法包括特殊字符的使用(请勿与HTML特殊字符混淆)。在正则表达式中具有特殊含义的字符是:. * ? + [ ] ( ) { } ^ $ | \。每当您想按字面意义使用它们时,都需要反斜杠。例如,如果要匹配“.”,则必须编写\.。所有其他字符将自动采用其字面含义。
以下各节描述了可用于制定模式的各种选项:
字符模式周围的方括号称为字符类,例如[ABC]。 字符类始终匹配指定字符列表中的单个字符,这意味着表达式[abc]只匹配a、b或c字符。
也可以定义否定的字符类,以匹配除括号中包含的字符以外的任何字符。否定的字符类是通过将尖号(^)符号紧接在左括号之后来定义的,例如[^abc]。
يمكنك أيضًا تعريف نطاق الحروف باستخدام شرطية (مثل -) [0-9]. دعنا نرى بعض أمثلة على شرطية الحروف:
تعبير النمط | ما يمكن أن يفعله |
---|---|
[abc] | أي حرف من 'a', 'b', 'c'. |
[^abc] | كل حرف غير 'a', 'b', 'c'. |
[a-z] | [a-z] |
[A-Z] | [A-Z] |
[A-Z] | [a-Z] |
[0-9] | [0-9] |
[a-z0-9] | التفاوت بين الحرف 'a' و 'z' أو الرقم '0' و '9'. |
النموذج التالي سيوضح لك كيفية استخدام تعبيرات النصوص ووظيفة PHP preg_match() للبحث عن وجود نموذج في النص:
<?php $pattern = "/ca[kf]e/"; $text = "He was eating cake in the cafe."; if(preg_match($pattern, $text)){}} echo "Match found!"; } echo "Match not found."; } ؟>اختبار
بالمثل، يمكنك استخدام وظيفة preg_match_all() للبحث عن جميع الصفوف التي تتطابق مع النمط في السلسلة:
<?php $pattern = "/ca[kf]e/"; $text = "He was eating cake in the cafe."; $matches = preg_match_all($pattern, $text, $array); إصدارُ $matches . ' matches were found.'; ؟>اختبار
إشارة:تعبر النمط ليست مخصصة لـ PHP فقط. تستخدم لغات مثل Java، Perl، Python نفس الرموز للبحث عن أنماط النص.
بعض الأحرف المحددة (مثل الأرقام، الحروف والفراغات) تستخدم بشكل متكرر، لذا لديها أسماء مختصرة. الجدول أدناه يُظهر هذه الأحرف المحددة المسبقة التعريف:
الطريق المختصر | ما يمكن أن يفعله |
---|---|
. | يُناسب أي حرف غير رمز النسخة \n. |
\d | يُناسب أي حرف رقم. نفس[0-9]. |
\D | يُناسب أي حرف غير رقم. نفس[^0-9] |
\s | يُناسب أي حرف فراغ (فراغ، رمز النسخة، الرمز الناتج عن النسخة، الرمز الناتج عن التأثير). نفس[\t\n\r] |
\S | يُناسب أي حرف غير فراغ. نفس[^\t\n\r] |
\w | يُناسب أي حرف كلمة (محدد من a إلى z، A إلى Z، 0 إلى 9 وخط السفلية). نفس[a-zA-Z_0-9] |
\W | يُناسب أي حرف غير كلمة. نفس[^a-Za-Z_0-9] |
السلسلة التالية ستعرض لك كيفية استخدام تعبير النمط ووظيفة preg_replace() في PHP لاستخدام شرط النقطة السوداء البديلة لتحديد وتغيير الفراغات في السلسلة:
<?php $pattern = "/\s/"; $replacement = "-"; $text = "Earth revolves around\nthe\tSun"; //يُستبدل الفراغ، الرمز الناتج عن النسخة، الرمز الناتج عن التأثير إصدارُ preg_replace($pattern, $replacement, $text); echo "<br>"; //يُستبدل الفراغ فقط echo str_replace(" ", "-", $text); ؟>اختبار
في الفصل السابق، تعلمنا كيفية التطابق مع حرف واحد بطرق متعددة. ولكن ماذا إذا كنت ترغب في التطابق مع عدة أحرف؟ على سبيل المثال، لنفترض أنك تبحث عن كلمة تحتوي على مرة واحدة أو أكثر من الحرف p، أو كلمة تحتوي على على الأقل صفرين من p، إلخ. هذا هو مكان العمل للاحصائيات. باستخدام الاحصائيات، يمكنك تحديد عدد مرات تطابق الحرف في التعبير العادي.
الجدول أدناه يُظهر مختلف الطرق لكمية تحديد النمط المحدد:
تعبير النمط | ما يمكن أن يفعله |
---|---|
p+ | يُناسب مرة واحدة أو أكثر من الحروف p. |
p* | يُناسب صفر أو أكثر من الظهور من الحرف p. |
p? | يُناسب صفر أو ظهور مرة واحدة من الحرف p. |
p{2} | مطابقة بالضبط لمرتين من حرف "p". |
p{2,3} | مطابقة على الأقل مرتين من حرف "p"، ولكن لا تزيد عن ثلاثة ظهور. |
p{2,} | مطابقة مرتين أو أكثر من حرف "p". |
p{,3} | مطابقة أقصى ثلاثة ظهور لحرف "p". |
في هذا المثال، سيعرض تعبير النمط باستخدام دالة PHP preg_split() سلسلة من الفواصل العريضة، الفواصل العريضة، الفواصل العريضة أو مزيج منهم:
<?php $pattern = "/[\s,]+/"; $text = "My favourite colors are red, green and blue"; $parts = preg_split($pattern, $text); //مرور عبر مصفوفة $parts وعرض الأجزاء الفرعية foreach($parts as $part){ echo $part . "<br>"; } ؟>اختبار
في بعض الحالات، قد ترغب في مطابقة السطر أو الكلمة أو النهاية أو البداية. يمكنك القيام بذلك باستخدام نقاط التحديد. من النقاط التحديد الشائعة هي العلامة (^) التي تمثل بداية السلسلة ورمز ($) الذي يمثل نهاية السلسلة.
تعبير النمط | ما يمكن أن يفعله |
---|---|
^p | التوافق مع حرف "p" عند بداية السطر. |
p$ | التوافق مع حرف "p" عند نهاية السطر. |
في هذا المثال، سيعرض تعبير النمط باستخدام دالة PHP preg_grep() فقط الأسماء في مصفوفة الأسماء التي تبدأ بحرف "J":
<?php $pattern = "/^J/"; $names = array("Jhon Carter", "Clark Kent", "John Rambo"); $matches = preg_grep($pattern, $names); //مرور عبر مصفوفة $matches وعرض الأسماء المطابقة foreach($matches as $match){ echo $match . "<br>"; } ؟>اختبار
معدلات النمط تسمح لك بتحديد كيفية معالجة تطابق النمط. يتم وضع معدلات النمط مباشرة بعد تعبير النمط، على سبيل المثال، إذا كنت ترغب في البحث عن نمط غير معتمد على الحالة، يمكنك استخدام معدل i، كما في التالي: /pattern/i. يتم عرض بعض معدلات النمط الأكثر شيوعًا في الجدول التالي.
معدل | ما يمكن أن يفعله |
---|---|
i | جعل التوافق غير معتمد على الحالة. |
m | تغيير سلوك ^ و $ لتطابق حدود مسافات الهروب (أي بداية أو نهاية كل سطر في سطرين متعددة)، وليس حدود السلسلة. |
g | تقوم بمطابقة عالمية، أي العثور على جميع النسخ. |
o | يتم حساب التعبير مرة واحدة فقط. |
s | تغيير سلوك النقطة لتناسب جميع الحروف بما في ذلك مسافات الهروب. |
x | يُسمح لك باستخدام الفراغات والملاحظات في patterns العادمة للحفاظ على الوضوح. |
يوضح المثال التالي كيفية استخدام وصلات i المعدلة مع وظيفة PHP preg_match_all() للبحث الكامل غير المتميز بالحالة.
<?php $pattern = '/color/i'; $text = 'اللون الأحمر أكثر وضوحًا من لون الأزرق في ضوء الشمس.'; $matches = preg_match_all($pattern, $text, $array); إصدارُ $matches . ' matches were found.'; ؟>اختبار
كذلك، يوضح المثال التالي كيفية استخدام وصلات ^ و m المعدلة مع وظيفة PHP preg_match_all() في كل سطر من سلاسل النصوص المتعددة.
<?php $pattern = '/^color/im'; $text = 'اللون الأحمر أكثر وضوحًا من لون الأزرق في ضوء الشمس.'; $matches = preg_match_all($pattern, $text, $array); إصدارُ $matches . ' matches were found.'; ؟>اختبار
يمكن استخدام حروف الحدود (\b) لمساعدتك في البحث عن الكلمات التي تبدأ أو تنتهي بالمuster. على سبيل المثال، يمتد pattern /\bcar/ إلى الكلمات التي تبدأ بـ pattern car، ويطابق cart، carrot، أو cartoon، ولكنه لا يطابق oscar.
بالمثل، يمتد pattern /car\b/ إلى الكلمات التي تنتهي بـ pattern car، ويطابق scar، oscar، أو supercar، ولكنه لا يطابق cart. كذلك، يمتد /\bcar\b/ إلى الكلمات التي تبدأ وتنتهي بكلمة car، ويطابق فقط كلمة car.
في المثال التالي، سيتم تمييز الكلمات التي تبدأ بـ car بالخط粗.
<?php $pattern = '/\bcar\w*/'; $replacement = '<b>$0</b>'; $text = 'كلمات تبدأ بـ car: cart, carrot, cartoon. كلمات تنتهي بـ car: scar, oscar, supercar.'; إصدارُ preg_replace($pattern, $replacement, $text); ؟>اختبار
نأمل أن تكون قد فهمت الأساسيات الأساسية لـ patterns العادمة. للحصول على معرفة كيفية استخدام patterns العادمة لتحقق من بيانات النموذج، يرجى الرجوع إلىتحقق من نماذج PHPالدليل.