php : التعابير العادية

regex : استعمال الرّموز في الأنماط

آخر تحيين: 01-05-2014

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


تعرّفنا على مجموعة من الرّموز و وظيفة كل واحد . لا بأس بعرضها عليكم مرة أخرى :
# ! ^ $ ( ) [ ] { } ? + * . \ |
إذا كانت هذه الرّموز محجوزة للوظائف . كيف يمكنني استعمالها في الأنماط للبحث عنها ؟
لاستعمال هذه الرّموز لدينا طريقتين مُختلفتين :

  1. استعمالها داخل المصفوفات
  2. استعمالها خارج المصفوفات

استعمال الرّموز خارج المصفوفات

لاستعمال الرّموز خارج المصفوفات نضيف علامة backslash "\" قبلها .
مثلا رمز علامة الإستفهام "?" يتيح لنا تكرار مُكوّن نص مرّة واحدة أو لاشيء . و أنا أريد استغلاله في نمط البحث أيضاً . مثلا لدي نص كالتالي : "what ?". لا يمكنني إنشاء نمطي كالتالي #^what ?$# لأن هذا يعني أن الفراغ الذي يلي حرف "t" ليس إجباريا ، يمكن أن يظهر مرّة واحدة أو لا شيء . لإتاحة علامة الإستفهام ، ما عليكم سوى إضافة علامة backslash " \ " قبل الرّمز
#^what \?$# هذا يعني أننا نبحث عن الكلمة "what ?"
هذا ينطبق على جميع العلامات الأخرى . يجب دائما إضافة علامة " \ " لاستعمالها .

استعمال الرّموز داخل المصفوفات

أثناء استعمال الرموز داخل المصفوفات . لستم محتاجين لإضافة علامة " \ " قبلها ، إلا في حالات نادرة . إذ نكتبها بشكل عادي .
مثال :
#^[a-z0-9+*.{}?]$#
أتحنا للنص أن يبدأ و ينتهي بالحروف اللاتينية الصغيرة أو علامة زائد أو نجمة أو نقطة أو اللاّمّتين أو علامة استفهام .

لدينا ثلاث حالات خاصة لا ينطبق عليها ما رأيناه . و هي علامات : "#" و "-" و "]"
بالنسبة لعلامتي "#" و "]" يجب إضافة علامة backslash قبلهما . سواء خارج أو داخل المصفوفة مثال :
#^[a-z\#.?]$#
أمّا بالنسبة لعلامة عارضة "-" . يمكننا استعمالها إما في بداية المصفوفة أو نهايتها ، دون استعمال علامة backslash . مثال
#^[-a-z]$# أو #^[a-z-]$#

نختم هذا الدّرس بأمثلة تُلخّص أغلب ما رأيناه :

النمطالنصالنتيجة
#^[a-z]+$#www.mysite.comخطأ
#^[a-z.]+$#www.mysite.comصحيح
#^w{3}[a-z.]+$#www.mysite.comصحيح
#^w{3}\.[a-z]+\.[a-z]+$#www.mysite.comصحيح
#^w{3}\.[a-z]{2,}\.[a-z]{2,4}$#www.mysite.comصحيح

كما لاحظتم في الأمثلة أعلاه ، حاولنا مُطابقة جميع عناوين الويب "URL" التي على هذا الشكل : "www.mysite.com" أو "www.myothersite.info" ...
سأشرح نمط المثال الأخير ، لأنه يشمل أغلب ما رأيناه . لمطابقة عنواننا يجب أن نأخذ بعين الإعتبار هذه الخطوات : يجب أن يبدأ عنوان الويب بثلاثة حروف "w" ثم تليها نقطة "." ثم اسم الموقع ثم نقطة ثم اسم النطاق
1 ـ يجب أن يبدأ عنواننا بثلاثة حروف "www" لا أقل و لا أكثر . لهذا بدأت النمط بحرف "w" و قمت بتكراره ثلاث مرات : #^w{3}#
2 ـ ثم يجب أن نتبع نمطنا بنقطة . وضعنا علامة "\" قبل النقطة ، لأنها خارج المصفوفة . لو لم نفعل ، لقمنا بإتاحة جميع مّكوّنات النص ما عدا الرجوع للسطر .
3 ـ ثم يأتي إسم الموقع و أتحنا فيه الحروف اللاتينية من الحجم الصغير فقط . و لا يجب أن يقل عدد حروف إسم الموقع عن حرفين :
[a-z]{2,}
4 ـ ثم أتحنا النقطة
5 ـ و أخيرا يأتي إسم النطاق ، و أتحنا فيه إما حرفين أو ثلاثا أو أربعا . بهذا يمكن لعنوان الويب أن ينتهي مثلا إمّا ب : "fr" أو "com" أو "info" ... :
\.[a-z]{2,4}$#
هذا هو نمطنا النهائي : #^w{3}\.[a-z]{2,}\.[a-z]{2,4}$#

مثال : التأكد من صحة عنوان الويب

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

<?php
$_POST['website'] = "www.mywebsite.org";

if (preg_match("#^w{3}\.[a-z]{2,}\.[a-z]{2,4}$#", $_POST['website']))
{
   echo 'عنوان الويب صحيح ';
}
else
{
   echo 'عذرا ، عنوان الويب الذي أدخلته غير صحيح';
}
?>
هذا مثال فقط . يمكننا تحسين هذا النمط كثيرا . لإتاحة جميع عناوين الويب المعقّدة .

مثلا نريد أن يبدأ العنوان أيضا بالعَلَمْ "http" أو "https" : مثلا "http://www.mysite.org" أو "https://www.mysite.org"
#^https?:\/\/w{3}\.[a-z]{2,}\.[a-z]{2,4}$#
باستعمال علامة استفهام ، جعلنا حرف "s" خياريا .
ثم استعملنا العلامة backslash "\" حتّى نتمكن من إتاحة الرّمزين "//" في العنوان .

استعمال علامة backslash " \ " قبل علامتي slash "http:\/\/" . ليس ضروريا في مثالنا . ما دمنا قد أحطنا النمط بعلامة "#" .
في حالة ما إذا كنا قد أحطنا النمط بعلامتي slash "/" . مثال : /^regex$/ . هنا يجب إضافة علامة backslash قبل كل علامة slash موجودة داخل النمط .
هذا لا ينطبق علا مثالنا ، لذا سنكتب علامة "/" ، بشكل عادي #^https?://

يمكننا دائما تحسين هذا النمط . مثلا نريد أن نجعل العلم "http://"خياريا . حتى نتيح سواء العناوين على هذه الشكل "www.mysite.org" أو "http://www.mysite.com" أو "https://www.mysite.com"
سنضع علمنا كله بين قوسين و نضيف له علامة استفهام كما تعلّمنا : #^(https?://)?
#^(https?://)?w{3}\.[a-z]{2,}\.[a-z]{2,4}$#

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