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

ملخص التعابير العادية

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

php رفع الملفات الببكود : أمثلة تطبيقية


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

محدّدات النمط

لاستعمال تعابير PCRE . يجب أن نُحيط الأنماط بمُحدّدات . يمكن تمثيل المحدّدات بأي مُكون من مكونات النص ، ما عدا الحروف و الأرقام و الفراغات و رمز backslash "\".
المحدّدات الأكثر استعمالا ، هي : "/" و "#" و "~" . هذه بعض أمثلة الإستعمال :
#^[a-z]+$#
/^[a-z]+$/
~^[a-z]+$~

إذا أردنا استعمال المُحدّد ، كمكون نص عادي داخل النمط ، يجب سبقه بعلامة backslash "\" .
من الأفضل اختيار المحدّد ، الذي لا نحتاجه كثيرا في نمط البحث . مثال :
/http:\/\//
#http://#

في هذه الحالة ، سأميل لاختيار مُحدّد "#" حتى يكون النمط سهل القراءة .

الرّموز

تتجلى قوة PCRE في الوظائف الهامة التي تؤديها الرموز . من إنشاء مصفوفات و معاملات التكرار و فرض بعض القيود على الأنماط . كما يمكن لنفس الرّمز أن يُستعمل لوظائف مختلفة مثل رمز علامة الإستفهام "?" و رمز "^" ، إلخ .

رموز PCRE
الرمزالشرح
\يتيح لنا استعمال الرّموز كمكونات نص عادية ، مثال : /http:\/\//
^لدينا حالتان :
^[a-z] : خارج المصفوفة ، يُؤكّد مُكوّنات بداية النّمط .
[^a-z] : داخل المصفوفة ،يؤكد المكونات التي لا يجب أن يبدأ بها نمط البحث .
$يُؤكد مكونات نهاية النمط
.تُتيح جميع مُكوّنات النص . ما عدا رمز السطر الجديد
?يتيح تكرار مكونات النص مرّة واحدة أو لا شيء مثال : .?. يمكننا أيضا استعماله بدل المحوّل "U".
*يتيح تكرار مكونات النص صفر مرة أو مرة واحدة أو أكثر ، مثال .*
+يتيح تكرار مكونات النص مرّة واحدة أو أكثر ، مثال .+
[ ]تحديد بداية و نهاية المصفوفة ، مثال : [a-zA-Z0-9]
-الرمز يعني : "من إلى" . يُستعمل داخل المصفوفة لتحديد حيز من الحروف و الأرقام .
مثلا [a-f] : تعني الحروف بين "a" و "f" . أي : [abcdef]
( )تحديد بداية و نهاية جزء من النمط ، سواء لغاية تكراره #^http://(www)? أو إعطائه صفة متغير "1$" مثال (.*?)
|معامل الإختيار ، مثال image\.(jpg|gif|png)
{ }تحديد بداية و نهاية معاملات التكرار ، مثال [a-z]{2,6}

محوّلات النمط

تقوم المحولات بتغيير تصرف النمط .

المُحوّلالشرح
iيجعل النمط لا يأخذ بعين الإعتبار حجم الحروف
mيجعل النمط يأخذ بعين الإعتبار أكثر من سطر . رمزي بداية "^" و نهاية "$" النمط سيوافقان بداية و نهاية سطر جديد بالإضافة إلى بداية و نهاية النص .
إذا لم يكن النمط يضم الرمزين "^" و "$" ، أو لم يكن لنا أي رجوع للسطر في النص . هذا المُحوّل لن يكون له أي تأثير
sتجعل رمز النقطة "." يأخذ بعين الإعتبار جميع مكونات النص ، حتى رمز الرجوع للسطر "r\" و رمز السطر الجديد "n\"
xلا يأخذ بعين الإعتبار الفراغات . إلا إذا كانت داخل مصفوفة أو مسبوقة بعلامة backslash "\"
e
أصبح هذا الرّمز من المهملات منذ إصدار PHP 5.5.0 . لذا لم يعد يُنصح باستعماله
يستعمل مع preg_replace . لتحويل نمط يضم شيفرات php إلى نتيجة فعلية لهذه الشيفرة
Uيجعل النمط غير شره . في حالة تكرار نفس نمط البحث مرات عدة في النص ، يقوم بمعالجة كل نمط على حدة . يمكننا استبدال هذا المُحوّل برمز علامة الإستفهام غالبا مسبوقة بعلامة التكرار "?*"
uيأخذ بعين الإعتبار ترميز UTF-8

مصفوفات النص

المصفوفات المختصرة
المصفوفةالمعنى
\dالأرقام من "0" إلى "9" ، يمكننا استبدالها بالمصفوفة [0-9]
\Dجميع مكوّنات النص ، ما عدا الأرقام ، يمكننا استبدالها بالمصفوفة [^0-9]
\wالحروف و الأرقام و علامة "_" ، يمكننا استبدالها بالمصفوفة [a-zA-Z0-9_]
\Wكل ما ليس حرفا أو رقما أو علامة "_" ، يمكننا استبدالها بالمصفوفة [^a-zA-Z0-9_]
\sالفراغات
\Sكل ما ليس فراغا

محولات أجزاء الأنماط

رأينا سابقا بأن مُحوّلات الأنماط ، تقوم بالتأثير على كل النمط . إذا أردنا التأثير على جزء فقط من النمط ، نقوم بتحديده أولا بالقوسين "( )" .
القوسان يقومان بتحديد جزء من النمط ، بُغية تكراره أو اعتباره كمتغيّر . يمكننا إعطاء وظائف أخرى للقوسين ، وذلك عن طريق إضافة بعض الرّموز بعد القوس الأول .

جزء النمط المُحوَّلالشرحمثال
(:?)ينزع صفة متغير من القوسين#^(.*?)\.(?:jpg|gif|png)$# : سيتم إعطاء صفة متغير للقوسين الأولين فقط (.*?)
أما القوسين المتبقيين (?:jpg|gif|png) نزعنا منهما هذه الصفة
(?=)نظرة إيجابية لما قبل جزء النمط المُحوَّلfoo(?=bar) : سيوافق النمط ، الكلمة "foo" شرط أن تكون متبوعة بالكلمة "bar"
(?!)نظرة سلبية لما قبل جزء النمط المُحوَّلfoo(?!bar) : سيوافق النمط ، الكلمة "foo" شرط أن لا تكون متبوعة بالكلمة "bar"
(?<=)نظرة إيجابية لما بعد جزء النمط المُحوَّل(?<=foo)bar : سيوافق النمط ، الكلمة "bar" شرط أن تكون مسبوقة بالكلمة "foo"
(?<!)نظرة سلبية لما بعد جزء النمط المُحوَّل(?<!foo)bar : سيوافق النمط ، الكلمة "bar" شرط أن لا تكون مسبوقة بالكلمة "foo"

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

خاتمة : التعابير العادية مجال لا نتعلمه بقراءة درس أو درسين ، بل تعلم دائم و مستمر