التعبيرات العادية (الأنماط). PHP (التعبير العادي) - ما هو؟ أمثلة واختبار التعبيرات العادية

18.08.2019

تعد التعبيرات العادية أداة معالجة سلاسل قوية جدًا، ولكن من الصعب في نفس الوقت فهمها. سأصف النقاط الرئيسية. التعبير العادي هو نمط سلسلة. باستخدام هذا القالب، يمكنك البحث عن التكرارات وإجراء عمليات الاستبدال والتحقق من التوافق مع القالب.

قواعد لإنشاء نمط

يجب الإشارة إلى حدود القالب برموز معينة، غالبًا ما تستخدم " / "، لكني أفضل استخدام" # " لأن كثرة الخطوط المائلة الأمامية/الخلفية يمكن أن تبهر عينيك، وعادةً لا يتم استخدام علامات التجزئة في أي مكان آخر. لذلك: " #HereBodyRegularExpression#"

يتم استخدام الأقواس داخل التعبير العادي - وهي عبارة عن تعبيرات فرعية يمكن معالجتها، على سبيل المثال:

#^/catalog/(+)/(+)\.html.*#

تم تصميم هذا التعبير للحصول على المعلمات في سلسلة عنوان URL. في بداية السطر هناك حرف خاص " ^ " - وهذا يعني بداية السطر. ويأتي بعد ذلك " /فهرس/" - لا توجد أحرف خاصة هنا، هذا مجرد نص يجب أن يتضمنه السطر. ثم واجهنا قوسين، أي أننا وصلنا إلى التعبير الفرعي الأول. تشير الأقواس المربعة إلى العديد من الأحرف التي يمكن أن تكون في السطر في هذا المكان. العلامة " - "يعني التعداد. التوقيع" \ " يفلت من الأحرف الخاصة. وهكذا، في التعبير الفرعي الأول يمكن أن يكون لدينا حروف كبيرة وصغيرة من الأبجدية اللاتينية، وأرقام من 0 إلى 9، وشرطة سفلية، وشرطة ونقطة. الشرطة والنقطة هي أحرف خاصة، ولكن هنا هم تم تهريبها، فهنا مجرد رموز، بعد القوسين المربعين هناك علامة ". + " - هذا يعني أن الحرف السابق (وبالنسبة لنا هذه مجموعة من الأحرف المحددة بين قوسين مربعين) يمكن أن يظهر مرة واحدة أو أكثر. ثم يأتي " / " هو مجرد رمز، وتعبير فرعي ثانٍ مماثل. ثم يأتي " \.لغة البرمجة"ما الذي يعنيه هذا النص" .لغة البرمجة". ثم الأحرف الخاصة " .* "النقطة تعني أي حرف، والنجمة تعني أي مقدار من الحرف السابق. أي بعد " .لغة البرمجة"أي شيء يمكن أن يذهب.

بيان الكمية، الكميات

أعلاه، لقد نظرنا بالفعل في مثل هذه الرموز التي تشير إلى عدد الرموز السابقة، مثل + و * . فيما يلي جميع الاحتمالات لتحديد الكميات:

شخصيات خاصة

هناك اختصارات خاصة لبعض مجموعات الأحرف:

"جشع"

دعونا نلقي نظرة على مفهوم جشع التعبير العادي. على سبيل المثال هناك خط:

#()#

نقرأ: التعبير الفرعي:

يبدو أن كل شيء صحيح، والتعبير الفرعي مناسب:

ولكنه يناسب أيضًا:

هذا ما سنحصل عليه، لأن... التعبيرات العادية جشعة بشكل افتراضي. يمكنك إزالة الجشع باستخدام المعدل " ش"، مثله:

#()#ش

الصفات التعريفية

يمكن أن يتبع التعبير العادي معدلات: " #HereBodyRegularExpression#HereModifiers"أنواع المعدلات:

أنا تمكين الوضع غير الحساس لحالة الأحرف، على سبيل المثال. لا تختلف الحروف الكبيرة والصغيرة في التعبير.
م يشير إلى أنه يجب التعامل مع النص الذي يتم البحث عنه على أنه يتكون من أسطر متعددة. افتراضيًا، يتعامل محرك التعبير العادي مع النص كسلسلة واحدة، بغض النظر عن ماهيته الفعلية. وفقا لذلك، الأحرف الفوقية "^" و"$"تشير إلى بداية ونهاية النص بأكمله. إذا تم تحديد هذا المعدل، فسوف يشيرون، على التوالي، إلى بداية ونهاية كل سطر من النص.
س الحرف التعريفي الافتراضي هو " . " لا يتضمن حرف السطر الجديد في تعريفه. يؤدي تحديد هذا المعدل إلى إزالة هذا القيد.
ش يزيل جشع التعبير العادي
ش تمكن التعبيرات العادية للعمل معها السيريلية إلى UTF-8وإلا فإنه لا يعمل بشكل صحيح.

وظائف php للعمل مع التعبيرات العادية

preg_replace

بحث واستبدال:

Preg_replace (نمط $ مختلط، استبدال $ مختلط، موضوع $ مختلط [، int $limit = -1 [، int &$count ]])؛

يمكن أن تكون كل قيمة سلسلة أو مصفوفة، في حالة $الموضوعصفيف - يتم إرجاع صفيف، وإلا سلسلة

preg_split

تقسيم سلسلة باستخدام تعبير عادي:

Preg_split (سلسلة $pattern، سلسلة $subject [، int $limit = -1 [، int $flags = 0 ]])؛

إرجاع مصفوفة تتكون من سلاسل فرعية من السلسلة المحددة موضوع، والتي يتم تقسيمها على طول الحدود المقابلة للنمط نمط.

) لقد عرضت لك مثالاً على استخدام التعبيرات العادية للعثور على أجزاء محددة من التعليمات البرمجية المصدر للصفحة. الآن سوف نتعلم كيفية كتابتها بأنفسنا. ستساعدك هذه المهارة على الكتابة ومسح النص من الأجزاء غير الضرورية والبحث عن الأجزاء الضرورية بكميات كبيرة من النص وما إلى ذلك.

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

  • preg_replace - البحث عن النص المطابق للتعبير العادي واستبداله؛
  • preg_match - مجرد بحث عادي؛
  • preg_split - البحث عن النص وتقسيمه.

على الأقل، في الدروس السابقة استخدمناها. بتعبير أدق، بدلاً من preg_match كان هناك preg_match_all، ولكن هذا هو نفس الشيء في الأساس، فقط الأخير لا يقاطع البحث بعد النتيجة الأولى. أي أننا إذا استخدمنا preg_match، فلن نجد كل التكرارات، بل الأول فقط.

يعد اختيار الوظيفة التي سيتم استخدامها في أي موقف أمرًا بسيطًا للغاية. نحتاج إلى الاستبدال - نستخدم الاستبدال، كما في الحالة عندما نحتاج إلى إزالة الأجزاء غير الضرورية من رمز الصفحة، هل تتذكر؟

$page = preg_replace("/ ^]/i"، ""، $page)؛ $page = preg_replace("/ ^]/i"، ""، $page)؛ $page = str_replace(""، ""، $page)؛

المعلمة الأولى للوظيفة هي شخصية عادية تحدد ما نبحث عنه. والثاني هو ما نستبدله به. ثالثا - أين ننظر؟ لذلك، أخذنا هنا المتغير $page وقمنا بتعيين نتيجة الدالة preg_replace له حيث بحثنا عن جميع أنواع الإدخال=مربع الاختيار، بالإضافة إلى فتح وإغلاق التسميات. لقد استبدلوها بـ "، أي أنهم ببساطة حذفوها. آمل أن يكون كل شيء واضحا هنا. سننتقل إلى تحليل التعبير نفسه (المعلمة الأولى للوظيفة) بعد قليل.
وكان هناك أيضًا مثال لاستخدام preg_match_all، والذي كان مفيدًا للعثور على جميع الروابط في النص المتبقي. كنا بحاجة إلى روابط حينها لأنها تحتوي على الكلمات الرئيسية التي كنا نحللها. وهنا ما حدث:

Preg_match_all("/ ]+?>(.*?)<\/a>/uis",$page,$ok); for ($j=0; $j ".$ok[$j].""; }

المعلمة الأولى هي مرة أخرى تعبير عادي للعثور على جميع الروابط المضمنة بشكل طبيعي في العلامة "a" (إذا لم تكن معتادًا على ترميز html، فاقرأ). والثاني هو متغير يحتوي على النص الذي سيتم البحث فيه. المعلمة الثالثة هي المتغير الذي تم وضع النتيجة فيه - $ok. بعد ذلك، كل ما تبقى هو المرور عبر جميع العناصر الضرورية لـ $ok للحصول على المفاتيح التي نحتاجها. بشكل منفصل، ينبغي أن يقال أنه عند الإخراج نحصل على مجموعة متعددة الأبعاد. ولهذا السبب عرضناها بهذه الطريقة المعقدة: $ok[$j]. لعرض بنية المصفوفة، استخدم الوظيفة أدناه وسوف تفهم كل شيء.

Print_r($ok);

يبدو أننا قمنا بفرز الوظائف التي استخدمناها في عملنا. الآن كل ما تبقى هو تعلم كيفية كتابة نفس هذه التعبيرات النمطية، والتي هي المعلمة الأولى لكل من هذه الطرق. دعنا ننتقل إلى الشيء الأكثر أهمية.

كيفية كتابة الجمل العادية

أولا، دعونا ننظر إلى الهياكل الأساسية. التعبيرات لديها خيارات. يتم تحديدها بحرف واحد ومكتوبة في النهاية، مسبوقة بشرطة مائلة.

بالإضافة إلى ذلك، يتم دعم الأحرف الأولية التالية:

يمكن أن تحتوي الأحرف الأولية بدورها على معدلات:

حسنًا، يمكننا الآن الانتقال إلى تحليل أنماطنا المنتظمة من الدرس الأخير. بناء على العلامات المذكورة أعلاه، دعونا نحاول فهم ما لدينا. وهنا التعبير:

/^]/ط

تشير الشرطتان المائلتان الأولى والأخيرة "/" إلى وجود تعبير عادي بداخلهما. في الوقت نفسه، بعد الأخير، نضع "i"، وهذا خيار، كما هو الحال في الجدول الأول - لا تأخذ الحالة في الاعتبار. داخل الخطوط المائلة يوجد التسلسل المنتظم نفسه. يبدأ بعلامة أقل من وعلامة الإدخال، وكل ما يأتي بعد ذلك حتى علامة النقطة هو مجرد نص عادي يجب البحث عنه. لكن النقطة نفسها، والرموز التي تليها، أكثر إثارة للاهتمام. في هذه الحالة، البناء ".*؟" يعني أي تسلسل من الأحرف. بمعنى، إذا قمنا بدمج النص فقط وهذا البناء، فسنقوم بتحديد النص بأكمله بعد التواجد الأول وحتى النهاية. للتوقف، تحتاج إلى مواجهة علامة إغلاق HTML "أكثر من" أو حرف سطر جديد. هذا التصميم يمنحنا مثل هذه الفرصة:

يتم توصيل الأحرف الموجودة بين قوسين مربعين بواسطة OR المنطقي. النهاية هي علامة أكبر من أو بداية السطر.
هذا هو كل التعبير، حيث قمنا بتعيين حالة البداية والحالة الوسطى والنهاية. ليس صعبا، أليس كذلك؟ وإليك توضيحًا للوضوح:

دعونا نلقي نظرة على شيء آخر لترسيخ كل شيء. بحثنا عن روابط معهم:

/]+?>(.*?)<\/a>/uis

نقرأ التعبير. مرة أخرى، نتجاهل الخطوط المائلة والخيارات أولاً. علامات "uis" تشرح نفسها بذاتها، باستثناء "u"، التي لم أصفها - فهي توضح أننا نستخدم ترميز Unicode. لم يبق الكثير. البداية هي العلامة "a"، التي تفتح، ثم يأتي الفصل

مما يعني أنه ليس أكبر أو أقل من (فتح وإغلاق علامات HTML)، أي أي أحرف في هذه الحالة. تمت إضافة "+؟" إلى الفصل، مما يعني أن هذا الفصل سيكون حاضرًا مرة واحدة أو أكثر (ولكن مرة واحدة على الأقل بالتأكيد). ثم تأتي علامة html الختامية للعلامة "a". يوجد نص داخل الرابط الذي تحدده المجموعة

بعد كل شيء، نحن لا نعرف أي نوع من النص سيكون هناك، لذلك نحدد هذه المجموعة. وفي النهاية هناك علامة إغلاق "أ":

يرجى ملاحظة أننا نتخلص من الشرطة المائلة باستخدام شرطة مائلة عكسية بحيث يُنظر إليها على أنها نص بسيط.

أوف. الموضوع معقد حقًا ويتطلب ممارسة. ربما أفعل شيئًا ليس على النحو الأمثل تمامًا ومن الممكن إنشاء تعبيرات عادية أخرى أكثر صحة، لكنني علمت نفسي مثلك، لذا لا تحكم بصرامة، بل شارك خياراتك في التعليقات. وأيضًا، إذا كان هناك شيء غير واضح، فإن صفحة التعليقات والتواصل في خدمتكم.

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

يتطلب التطور السريع للإنترنت ولغات تطوير الويب إنشاء أدوات عالمية ومدمجة لمعالجة المعلومات النصية مع الحد الأدنى من التعليمات البرمجية المطلوبة لذلك. لغة PHP، المشهورة بين المبتدئين والمطورين المحترفين، ليست استثناءً. يسمح لك التعبير العادي كلغة قالب نص بتبسيط مهام معالجة النص وتقليل كود البرنامج بعشرات ومئات الأسطر. لا يمكن حل العديد من المشاكل بدونها.

التعبيرات العادية في PHP

تحتوي لغة PHP على ثلاث آليات للعمل مع التعبيرات العادية - "ereg"، و"mb_ereg" و"preg". الأكثر شيوعًا هي واجهة "preg"، التي توفر وظائفها الوصول إلى مكتبة التعبير العادي PCRE، والتي تم تطويرها في الأصل للغة Perl، والتي تم تضمينها في PHP. تقوم وظائف Preg بالبحث في سلسلة نصية معينة عن التطابقات وفقًا لنمط معين في لغة التعبير العادية.

أساسيات بناء الجملة

في مقالة قصيرة، من المستحيل أن تصف بالتفصيل بناء جملة التعبيرات العادية؛ هناك أدبيات خاصة لهذا الغرض. نقدم فقط العناصر الرئيسية لإظهار الإمكانيات الواسعة للمطور وفهم أمثلة التعليمات البرمجية.

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

على سبيل المثال، في التعبير /\d(3)-\d(2)-\d(2)/مسيكون الفاصل «/» ، ثم يأتي النمط والرمز "م"سيكون معدلا.

يتم تشفير كل قوة التعبيرات العادية باستخدام الأحرف الأولية. الحرف الرئيسي الرئيسي للغة هو الخط المائل العكسي - "\". إنه يعكس نوع الحرف الذي يتبعه (أي أن الحرف العادي يصبح حرفًا أوليًا والعكس صحيح). الحرف التعريفي المهم الآخر هو الشرطة المائلة للأمام "|"، والتي تحدد الأشكال البديلة للنمط. المزيد من الأمثلة على الأحرف الأولية:

PHP، عند معالجة التعبيرات العادية، تتعامل مع المسافة كحرف مهم منفصل، وبالتالي فإن التعبيرين ABCWHERE و ABCWHERE مختلفان.

الأنماط الفرعية

في PHP، يتم فصل الأنماط الفرعية العادية بين قوسين وتسمى أحيانًا "التعبيرات الفرعية". تنفيذ الوظائف التالية:

    تسليط الضوء على البدائل. على سبيل المثال، القالب الحرارة(شيء|طائر|)يطابق الكلمات "الحرارة"، "طائر النار"و "منال". وبدون الأقواس سيكون مجرد سلسلة فارغة، "طائر" و"مشوي".

    النمط الفرعي "المثير".هذا يعني أنه إذا تطابقت سلسلة فرعية في النمط، فسيتم إرجاع جميع المطابقات كنتيجة. من أجل الوضوح، دعونا نعطي مثالا. بالنظر إلى التعبير العادي التالي: الفائز يحصل على((ذهبية|مذهبة)(ميدالية|كأس)) -وخط للعثور على التطابقات: "الفائز يحصل على ميدالية ذهبية". بالإضافة إلى العبارة الأصلية، ستظهر نتيجة البحث: "الميدالية الذهبية", "ميدالية"، "ذهبية".

عوامل التكرار (المربعات)

عند كتابة التعبيرات العادية، غالبًا ما يكون من الضروري تحليل تكرار الأرقام والرموز. هذه ليست مشكلة إذا لم يكن هناك الكثير من التكرار. ولكن ماذا نفعل عندما لا نعرف عددهم بالضبط؟ في هذه الحالة، يجب عليك استخدام أحرف خاصة.

لوصف التكرارات، يتم استخدام التربيعات - الرموز الوصفية لتحديد الكمية. الرباعيات نوعان:

  • عام، بين قوسين؛
  • مختصر.

يحدد المحدد الكمي العام الحد الأدنى والحد الأقصى لعدد التكرار المسموح به لعنصر ما، معبرًا عنه برقمين بين قوسين متعرجين، مثل هذا: x(2,5). إذا كان الحد الأقصى لعدد التكرارات غير معروف، فسيتم حذف الوسيطة الثانية: x(2,).

تمثل محددات الكمية المختصرة رموزًا للتكرارات الأكثر شيوعًا لتجنب الفوضى النحوية غير الضرورية. يتم استخدام ثلاثة اختصارات بشكل شائع:

1.* - صفر تكرار أو أكثر وهو ما يعادل (0,).

2. + - تكرار واحد أو أكثر، أي،).

3. ؟ - صفر أو تكرار واحد فقط - (0,1).

أمثلة التعبير العادي

بالنسبة لأولئك الذين يتعلمون التعبيرات العادية، فإن الأمثلة هي أفضل برنامج تعليمي. وسنقدم عددًا قليلاً منها يظهر قدراتها الواسعة بأقل جهد. جميع رموز البرامج متوافقة تمامًا مع إصدارات PHP 4.x والإصدارات الأحدث. لفهم بناء الجملة بشكل كامل واستخدام جميع ميزات اللغة، نوصي بكتاب J. Friedl "Regular Expressions"، الذي يناقش بناء الجملة بشكل كامل ويحتوي على أمثلة للتعبيرات العادية ليس فقط في PHP، ولكن أيضًا في Python وPerl وMySQL، جافا وروبي وC#.

التحقق من صحة عنوان البريد الإلكتروني

مهمة.توجد صفحة على الإنترنت تطلب من الزائر عنوان بريده الإلكتروني. يجب أن يتحقق التعبير العادي من صحة العنوان المستلم قبل إرسال الرسائل. لا يضمن التحقق أن صندوق البريد المحدد موجود بالفعل ويقبل الرسائل. ولكن يمكنه التخلص من العناوين غير الصحيحة بشكل واضح.

حل.كما هو الحال مع أي لغة برمجة، يمكن تنفيذ التعبيرات العادية للتحقق من عنوان البريد الإلكتروني في PHP بعدة طرق، والأمثلة الواردة في هذه المقالة ليست الحل الشامل والنهائي. لذلك، في كل حالة سنقدم قائمة بالمتطلبات التي يجب مراعاتها عند البرمجة، ويعتمد التنفيذ المحدد كليًا على المطور.

لذا، فإن التعبير الذي يتحقق من صحة البريد الإلكتروني يجب أن يتحقق من الشروط التالية:

  1. وجود الرمز @ في السلسلة المصدرية وعدم وجود مسافات.
  2. يحتوي جزء المجال من العنوان، متبوعًا بالرمز @، على أحرف صالحة لأسماء النطاقات فقط. الأمر نفسه ينطبق على اسم المستخدم.
  3. عند التحقق من اسم المستخدم، تحتاج إلى البحث عن أحرف خاصة مثل الفاصلة العليا أو من المحتمل أن تكون هذه الأحرف خطيرة ويمكن العثور عليها في هجمات مثل حقن SQL. تجنب مثل هذه العناوين.
  4. تسمح أسماء المستخدمين بنقطة واحدة فقط، والتي لا يمكن أن تكون الحرف الأول أو الأخير في السطر.
  5. يجب أن يحتوي اسم النطاق على حرفين على الأقل ولا يزيد عن ستة أحرف.

يمكن رؤية المثال الذي يأخذ في الاعتبار كل هذه الشروط في الشكل أدناه.

التحقق من صحة عناوين URL

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

حل.تبدو نسختنا النهائية كما يلي:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

الآن دعونا نلقي نظرة على مكوناته بمزيد من التفصيل باستخدام الشكل.

التحقق من أرقام بطاقات الائتمان

مهمة.من الضروري التحقق من صحة رقم البطاقة البلاستيكية المدخلة لأنظمة الدفع الأكثر شيوعًا. يعتبر الخيار للبطاقات فقط

حل.عند إنشاء تعبير، يجب أن تأخذ في الاعتبار احتمال وجود مسافات في الرقم المدخل. يتم تقسيم الأرقام الموجودة على البطاقة إلى مجموعات لتسهيل القراءة والإملاء. ولذلك فمن الطبيعي أن يحاول الشخص إدخال الرقم بهذه الطريقة (أي باستخدام المسافات).

تعد كتابة تعبير عالمي يأخذ في الاعتبار المسافات والواصلات المحتملة أكثر صعوبة من مجرد التخلص من جميع الأحرف باستثناء الأرقام. ولذلك، فمن المستحسن استخدام الحرف الأولي /D في التعبير، مما يؤدي إلى إزالة كافة الأحرف باستثناء الأرقام.

الآن يمكنك المتابعة مباشرة للتحقق من الرقم. تستخدم جميع شركات بطاقات الائتمان تنسيق أرقام فريدًا. يستخدم المثال هذا، ولا يحتاج العميل إلى إدخال اسم الشركة - يتم تحديده حسب الرقم. تبدأ بطاقات فيزا دائمًا بالرقم 4 ويبلغ طولها 13 أو 16 رقمًا. تبدأ بطاقة MasterCard في النطاق 51-55 بطول رقم 16. ونتيجة لذلك، نحصل على التعبير التالي:

قبل معالجة الطلب، يمكنك إجراء فحص إضافي للرقم الأخير من الرقم، والذي يتم حسابه باستخدام خوارزمية Luhn.

التحقق من أرقام الهواتف

مهمة.التحقق من صحة رقم الهاتف المدخل.

حل.يختلف عدد الأرقام في أرقام الهواتف الأرضية والمحمولة بشكل كبير من بلد إلى آخر، لذلك لا يمكن التحقق عالميًا من صحة رقم الهاتف باستخدام التعبيرات العادية. لكن الأرقام الدولية لها تنسيق صارم وهي رائعة للتحقق من القالب. علاوة على ذلك، يحاول عدد متزايد من مشغلي الهاتف الوطنيين الالتزام بمعيار واحد. هيكل الرقم هو كما يلي:

+CCC.NNNNNNNNNNxEEEE،أين:

C هو رمز البلد، ويتكون من 1-3 أرقام.

N - رقم يصل طوله إلى 14 رقمًا.

هـ - تمديد اختياري.

علامة الزائد هي عنصر مطلوب، وعلامة x موجودة فقط عندما يكون التوسيع ضروريًا.

ونتيجة لذلك، لدينا التعبير التالي:

^\+(1,3)\.(4,14)(?:x.+)?$

الأرقام في النطاق

مهمة.يجب عليك مطابقة عدد صحيح ضمن نطاق معين. بالإضافة إلى ذلك، من الضروري أن تتطابق التعبيرات العادية مع أرقام من نطاق من القيم فقط.

حل. فيما يلي بعض التعبيرات لعدد قليل من الحالات الأكثر شيوعًا:

العثور على عنوان IP

مهمة.يجب عليك تحديد ما إذا كانت السلسلة المحددة هي عنوان IP صالح بتنسيق IPv4 في النطاق 000.000.000.000-255.255.255.255.

حل.كما هو الحال مع أي مهمة في PHP، التعبيرات العادية لديها العديد من الاختلافات. على سبيل المثال، هذا:

التحقق من التعبير عبر الإنترنت

قد يكون اختبار صحة التعبيرات العادية أمرًا صعبًا بالنسبة للمبرمجين الجدد بسبب تعقيد بناء الجملة، والذي يختلف عن لغات البرمجة "العادية". لحل هذه المشكلة، هناك العديد من أدوات اختبار التعبير عبر الإنترنت التي تسهل التحقق من صحة القالب الذي تم إنشاؤه على النص الحقيقي. يقوم المبرمج بإدخال التعبير والبيانات المراد اختبارها ويرى على الفور نتيجة المعالجة. عادةً ما يكون هناك أيضًا قسم مرجعي حيث يتم وصف التعبيرات العادية والأمثلة واختلافات التنفيذ للغات البرمجة الأكثر شيوعًا بالتفصيل.

لكن لا يُنصح بالثقة الكاملة في نتائج الخدمات عبر الإنترنت لجميع المطورين الذين يستخدمون PHP. التعبير العادي، المكتوب والمختبر شخصيًا، يحسن مهارتك ويضمن عدم وجود أخطاء.

الاستخدام الأكثر شيوعًا للتعبيرات العادية في Perl هو البحث واستبدال العوامل مثل س//, م/، مشغلي الاتصال =~ أو != إلخ. كقاعدة عامة، لدى كل هؤلاء المشغلين خيارات مماثلة مثل:

عادةً ما يُشار إلى جميع هذه الخيارات بالرمز "/x". ويمكن حتى استخدامها داخل القوالب باستخدام البناء الجديد (؟...)

التعبيرات أو الأنماط العادية هي نفس إجراءات regexp في Unix. تم استعارة التعبيرات وبناء الجملة من إجراءات V8 الموزعة مجانًا بواسطة Henry Spencer، حيث تم وصفها بالتفصيل.

تستخدم القوالب الأحرف الأولية التالية (الأحرف التي تشير إلى مجموعات من الأحرف الأخرى) والتي تسمى غالبًا معيار egrep:

تحتوي الأحرف الأولية على معدلات (مكتوبة بعد الحرف الأولي):

وفي جميع الحالات الأخرى، تعتبر الأقواس المتعرجة أحرفًا عادية (عادية). وبالتالي فإن "*" يعادل (0,) و"+" يساوي (1,) و"؟" - (0.1). لا يمكن أن يكون n وm أكبر من 65536.

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

تعمل أحرف البدل بنفس طريقة عمل علامات الاقتباس المزدوجة، لذا يمكنك استخدام أحرف `\` - (أحرف الخط المائل العكسي) فيها:

\ ر - حرف علامة التبويب
- خط جديد
\ ص - عودة النقل
- ترجمة التنسيق
\الخامس - الجدولة العمودية
- يتصل
- يهرب
\033 - تدوين الرمز الثماني
\x1A - السداسي عشري
\ج[ - رمز التحكم
- الحرف الصغير التالي
- الأحرف الكبيرة -//-
\L - كافة الأحرف صغيرة حتى \E
\U - في الجزء العلوي -//-
\E - سجل محدد التغيير
- إلغاء الإجراء باعتباره حرفًا أوليًا

بالإضافة إلى ذلك، تمت إضافة الأحرف الأولية التالية إلى لغة Perl:

لاحظ أن هذا كله حرف "واحد". استخدم المعدلات للإشارة إلى التسلسل. لذا:

بالإضافة إلى ذلك، هناك أحرف أولية خيالية. الإشارة إلى رموز غير موجودة في المكان الذي تتغير فيه القيمة. مثل:

حد الكلمة (\b) هو نقطة وهمية بين الحرفين \w و\W. ضمن فئة الأحرف، يمثل "\b" حرف مسافة للخلف. الأحرف الأولية و - تشبه "^" و"$"، ولكن إذا كانت بداية السطر "^" ونهاية السطر "$" تعمل لكل سطر في سلسلة متعددة الأسطر، إذن و تشير إلى بداية ونهاية سلسلة متعددة الأسطر بأكملها.

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

مثال:

$s = "واحد 1 اثنان 2 وثلاثة 3"; إذا ($s =~ /(\d+)\D+(\d+)/) ( طباعة "$1\n"; # النتيجة "1" طباعة "$2\n"; # "2" طباعة "$+\n" ; # "2" print "$&\n"; # "1 two 2" print "$`\n"; # "One " print "$"\n"; # "وثلاثة 3");

يحتوي الإصدار 5 من Perl على بنيات قالب إضافية:

مثال:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # ابحث عن الرقم متبوعًا بـ "-" ( print "$1\n"; # النتيجة "2" ) else ( print "search error\n" ;)

(؟!نمط) - "النظر" إلى الأمام بالنفي:

مثال:

$s = "1+2-3*4"; if ($s =~ /(\d)(؟!\+)/) # ابحث عن رقم لا يتبعه "+" ( print "$1\n"; # النتيجة "2" ) else ( print "search خطأ\ن";)

(؟ismx) - المعدلات "الداخلية". إنه مناسب للاستخدام في القوالب، حيث، على سبيل المثال، تحتاج إلى تحديد معدل داخل القالب.

قواعد التعبير العادي (التعبير العادي)

  1. يمثل أي حرف نفسه ما لم يكن حرفًا أوليًا. إذا كنت تريد إلغاء تأثير حرف أولي، ضع "\" أمامه.
  2. تشير سلسلة الأحرف إلى سلسلة من هذه الأحرف.
  3. مجموعة الأحرف المحتملة (الفئة) محاطة بين قوسين مربعين ""، وهذا يعني أن أحد الأحرف المحددة بين قوسين يمكن أن يظهر في هذا المكان. إذا كان الحرف الأول بين قوسين هو "^"، فلا يمكن أن يظهر أي من الأحرف المحددة في هذه المرحلة في التعبير. داخل الفصل الدراسي، يمكنك استخدام الرمز "-" للإشارة إلى نطاق من الأحرف. على سبيل المثال، a-z هو أحد الحروف الصغيرة للأبجدية اللاتينية، 0-9 هو رقم، وما إلى ذلك.
  4. منتدى بوابة PHP. S. U.

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

لنبدأ ببعض الحكمة البرمجية الشائعة:

بعض الناس، عندما يواجهون مشكلة ما، يفكرون: "نعم، أنا ذكي، وسوف أقوم بحلها باستخدام التعبيرات العادية." الآن لديهم مشكلتين.

أمثلة القالب

لنبدأ ببعض الأمثلة البسيطة. التعبير الأول في الصورة أدناه يبحث عن تسلسل مكون من 3 أحرف، حيث الحرف الأول هو "k"، والثاني أي حرف روسي والثالث هو "t" غير حساس لحالة الأحرف (على سبيل المثال، "cat" أو "KOT" " يناسب هذا النمط). يبحث التعبير الثاني عن الوقت في النص بالتنسيق 12:34.

يبدأ أي تعبير بحرف محدد. عادةً ما يتم استخدام الرمز / كما هو، ولكن يمكنك أيضًا استخدام رموز أخرى ليس لها غرض خاص في التعبيرات العادية، على سبيل المثال، ~ أو # أو @. يتم استخدام المحددات البديلة إذا كان الحرف / قد يظهر في التعبير. ثم يأتي نمط السلسلة التي نبحث عنها، متبوعًا بمحدد ثانٍ، وفي النهاية قد يكون هناك حرف علم واحد أو أكثر. وهي تحدد خيارات إضافية عند البحث عن النص. فيما يلي أمثلة على الأعلام:

  • i - يقول أن البحث يجب أن يكون غير حساس لحالة الأحرف (حساس لحالة الأحرف بشكل افتراضي)
  • u - يقول أن التعبير والنص الذي يتم البحث عنه يستخدم ترميز utf-8، وليس الحروف اللاتينية فقط. بدونها، قد لا يعمل البحث عن الأحرف الروسية (وأي أحرف غير لاتينية أخرى) بشكل صحيح، لذا يجب عليك ضبطها دائمًا.

يتكون القالب نفسه من أحرف عادية وإنشاءات خاصة. حسنًا، على سبيل المثال، الحرف "k" في التعبيرات العادية يعني نفسه، لكن الرموز تعني "أي رقم من 0 إلى 5 يمكن أن يكون في هذا المكان". فيما يلي قائمة كاملة بالأحرف الخاصة (في دليل PHP يطلق عليها الأحرف الأولية)، وجميع الأحرف الأخرى في التسلسل العادي عادية:

أدناه سنقوم بتحليل معنى كل من هذه الأحرف (ونشرح أيضًا سبب وضع الحرف "е" بشكل منفصل في التعبير الأول)، ولكن الآن دعونا نحاول تطبيق تعبيراتنا العادية على النص ونرى ما سيحدث. لدى PHP وظيفة خاصة preg_match($regexp, $text, $match) تأخذ التعبير العادي والنص والمصفوفة الفارغة كمدخلات. يتحقق مما إذا كان النص يحتوي على سلسلة فرعية تتطابق مع النمط المحدد وترجع 0 إذا لم يكن كذلك، أو 1 إذا كان هناك. وفي المصفوفة التي تم تمريرها، يتم وضع أول تطابق تم العثور عليه مع التسلسل العادي في العنصر ذو الفهرس 0. لنكتب برنامجًا بسيطًا يطبق التعبيرات النمطية على سلاسل مختلفة:

بعد النظر إلى المثال، دعونا ندرس التعبيرات العادية بمزيد من التفصيل.

الأقواس في التعبيرات العادية

دعونا نراجع ما تعنيه الأنواع المختلفة من الأقواس:

  • تحدد الأقواس المتعرجة a(1,5) عدد مرات تكرار الحرف السابق - في هذا المثال، يبحث التعبير عن 1 إلى 5 أحرف متتالية "a"
  • الأقواس المربعة تعني "أي واحد من هذه الأحرف"، في هذه الحالة الأحرف a، b، c، x، y، z أو رقم من 0 إلى 5. لا تعمل الأحرف الخاصة الأخرى مثل | أو * - تشير إلى شخصية عادية. إذا كان هناك رمز ^ في بداية الأقواس المربعة، فإن المعنى يتغير إلى العكس: "أي حرف واحد باستثناء تلك المشار إليها" - على سبيل المثال [^a-c] يعني "أي حرف واحد باستثناء a أو b أو c".
  • مجموعة الأحرف والتعبيرات بين قوسين. على سبيل المثال، في التعبير abc+، تنطبق علامة الجمع فقط على الحرف c ويبحث التعبير عن كلمات مثل abc، وabcc، وabccc. وإذا وضعت قوسين a(bc)+، فإن المحدد الكمي plus يشير إلى التسلسل bc ويبحث التعبير عن الكلمات abc، abcbc، abcbcbc

ملاحظة: يمكنك تحديد نطاقات من الأحرف بين قوسين مربعين، لكن تذكر أن الحرف الروسي е منفصل عن الأبجدية، ولكتابة "أي حرف روسي" عليك أن تكتب [a-яе].

خطوط مائلة

إذا كنت قد اطلعت على دروس أخرى حول التعبيرات العادية، فمن المحتمل أنك لاحظت أن الشرطة المائلة العكسية تُكتب بشكل مختلف في كل مكان. في مكان ما يكتبون شرطة مائلة عكسية واحدة: \d ، ولكن هنا في الأمثلة يتم تكرارها مرتين: \\d . لماذا؟

تتطلب لغة التعبير العادي كتابة شرطة مائلة عكسية مرة واحدة. ومع ذلك، في السلاسل التي تحتوي على علامات اقتباس مفردة ومزدوجة في PHP، فإن الشرطة المائلة العكسية لها أيضًا معنى خاص: دليل حول السلاسل. حسنًا، على سبيل المثال، إذا كتبت $x = "\$"; ثم ستتعامل PHP مع هذا على أنه مجموعة خاصة وستدرج فقط الحرف $ في السلسلة (ولن يعرف محرك التعبير العادي وجود الشرطة المائلة العكسية قبلها). لإدراج التسلسل \$ في سلسلة، يجب علينا مضاعفة الشرطة المائلة العكسية وكتابة الكود بالشكل $x = "\\$"; .

لهذا السبب، في بعض الحالات (حيث يكون لتسلسل الأحرف معنى خاص في PHP) يُطلب منا مضاعفة الشرطة المائلة العكسية:

  • لكتابة \$ في التعبير العادي، نكتب "\\$" في الكود
  • لكتابة \\ في التعبير العادي، نضاعف كل شرطة مائلة عكسية ونكتب "\\\\"
  • لكتابة شرطة مائلة عكسية ورقم (\1) بتنسيق عادي، يلزمك مضاعفة الشرطة المائلة العكسية: "\\1"

في حالات أخرى، ستعطي شرطة مائلة عكسية واحدة أو اثنتين نفس النتيجة: "\\d" و"\d" ستدرج زوجًا من الأحرف \d في السطر - في الحالة الأولى، خطتان مائلتان عكسيتان هما التسلسل لإدراج شرطة مائلة عكسية ، في الحالة الثانية لا يوجد تسلسل خاص وسيتم إدراج الأحرف كما هي. يمكنك التحقق من الأحرف التي سيتم إدراجها في السلسلة وما سيراه محرك التعبير العادي باستخدام echo: echo "\$"; . نعم، الأمر صعب، ولكن ماذا يمكنك أن تفعل؟

تصاميم خاصة في الموسم العادي

  • \d يبحث عن أي رقم واحد، \D - أي حرف واحد باستثناء الرقم
  • \w يطابق أي حرف (من أي أبجدية) أو رقم أو شرطة سفلية _ . \W يطابق أي حرف باستثناء الحرف أو الرقم أو الشرطة السفلية.

هناك أيضًا شرط مناسب للإشارة إلى حد الكلمة: \b . هذا البناء يعني أنه على أحد جانبيه يجب أن يكون هناك حرف عبارة عن حرف/رقم/شرطة سفلية (\w)، وعلى الجانب الآخر يجب أن يكون هناك حرف ليس كذلك. حسنًا، على سبيل المثال، نريد العثور على كلمة "قطة" في النص. إذا كتبنا التعبير العادي /cat/ui، فستجد تسلسل هذه الأحرف في أي مكان - على سبيل المثال، داخل كلمة "ماشية". ومن الواضح أن هذا ليس ما أردناه. إذا أضفنا شرط حد الكلمة إلى التعبير العادي: /\bcat\b/ui، فسيتم الآن البحث عن الكلمة المستقلة "cat" فقط.

يدوي

  • بناء جملة التعبير العادي في PHP، وصف تفصيلي