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

php استعمال التعابيرالعادية

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

مصفوفات مُكوّنات النص sql JOIN : الربط بين الجداول


كيف نستعمل التعابير العادية ؟

تُستعمل التعابير العادية مع لغات البرمجة . في لغة php التي هي محورنا ، تُتيح لنا الإختيار بين نوعين من التعابير : POSIX و PCRE .
تعابير PCRE مأخوذة من لغة Perl . و هي الأقوى و الأسرع و الأكثر استعمالا ، سنولي كل اهتمامنا لها .
لاستعمال التعابير العادية ، توفّر لنا لغة PHP مجموعة متنوعة من الدّوال . منها :

  • preg_match : تقوم بالبحث عن نمط داخل النص
  • preg_replace : تقوم بالبحث عن النمط داخل النص ثم تستبدله بنص آخر
  • preg_split : تقوم بتقسيم النص إلى أجزاء

توجد دوال أخرى منها : preg_filter, preg_quote, preg_replace_callback ... تبقى كل من preg_match و preg_replace الأكثر استعمالا .
القاسم المشترك بين جميع دوال php المتوافقة مع PCRE . أنها تستعمل نفس التعابير العادية و بنفس الطّريقة .

preg_match : مُطابقة النمط

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

<?php
if (preg_match("#regex#", "text"))
{
   echo 'النمط الذي تبحث عنه موجود في النص';
}
else
{
   echo 'النمط غير موجود';
}
?>
regex : النمط الذي نريد البحث عنه
text : النص الذي سنبحث فيه عن النمط

لاحضوا أننا أحطنا النمط برمزي "#" حتّى تتعرف الدالة على بداية و نهاية التعابير العادية ، توجد رموز أخرى مثل (/) و (~) و (%) ، كلها صحيحة و يمكنكم استعمالها بدل "#"
هذه الرّموز تُستعمل لإحاطة النمط

لنرى مثالا بسيطا : سنبحث عن كلمة "مزارع" في النص

<?php
// النمط
$regex = '#مزارع#'; 
// النص
$text = 'ذهب المزارع في الصباح الباكر إلى المزرعة';

if (preg_match($regex, $text))
{
   echo 'صحيح';
}
else
{
   echo 'خطأ';
}
?>

الشيفرة تعني ، إذا كانت كلمة "مزارع" موجودة في النص فالشرط صحيح . و إذا كان عكس ذلك فالنتيجة خطأ .
قمنا بإحاطة كلمة "مزارع" برمزي (#) لأنها تمثل النمط الذي سنبحث عنه داخل النص text$
النتيجة ستكون صحيحة ، لأن كلمة مزارع موجودة في النص .
إذا استبدلتم نمط "مزارع" بنمط "فلاح" ستكون النتيجة خاطئة ، لأن كلمة "فلاح" غير موجودة في النص . لا تتهاونوا ، قوموا بجميع التجارب التي ستصادفونها .

حجم الحروف

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

<?php
if (preg_match("#gold#", "the Gold fever"))
{
   echo 'صحيح';
}
else
{
   echo 'خطأ';
}
?>

النتيجة ستكون خطأ ، لأن النمط "gold" يختلف عن "Gold" الموجودة في النص . فهذه الأخيرة تبدأ بحرف "G" كبير . لكي نجعل نمطنا لا يأخذ بعين الإعتبار حجم الخط ، إذا أردنا مثلا أن نعرف فقط إن كانت الكلمة التي نبحث عنها موجودة ، و لا يهمنا حجم الخط الذي كتبت حروفها به . سنضيف رمز "i" في نهاية النمط ، بعد رمز "#" :

#gold#i : هذا يعني أننا سنبحث إمّا عن كلمة "gold" أو "Gold" أو "GOLD" أو "GolD" ... إلخ

بعض الأمثلة

النّمطالنصالنتيجة
#Gold#the Gold feverصحيح
#gold#the Gold feverخطأ
#gold#ithe Gold feverصحيح
#GOLD#ithe Gold feverصحيح

عند إضافة الرمز "i" يعني أننا نبحث عن النمط بدون الإهتمام لحجم الحروف . مثلا "gold" أو "Gold" أو "GOLD" أو "gOLd" ... تعني نفس الشيء

الإختيار بين مجموعة من الأنماط

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

<?php
// النمط
$regex = '#فلاح|بستاني|مزارع#'; 
// النص
$text = 'ذهب المزارع في الصباح الباكر إلى المزرعة';

if (preg_match($regex, $text))
{
   echo 'صحيح';
}
else
{
   echo 'خطأ';
}
?>

قمنا بالبحث إمّا عن كلمة "فلاح" أو "بستاني" أو "مزارع"
بعض الأمثلة :

النّمطالنصالنتيجة
#فلاح|بستاني|مزارع#ذهب المزارع في الصباح الباكر إلى المزرعةصحيح
#فلاح|بستاني|مزارع#ذهب البستاني في الصباح الباكر إلى المزرعةصحيح
#فلاح|بستاني|مزارع#ذهب الصياد في الصباح الباكر إلى المزرعةخطأ

بداية و نهاية النمط

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

  • ^ : يُحدّد مُكوّنات بداية النمط
  • $ : يُحدّد مُكوّنات نهاية النمط

مثلا للبحث عن نمط "gold" شرط أن يكون في بداية النص :
#^gold#
للبحث عن النمط في نهاية النص فقط ، سنختمه برمز الدّولار "$" :
#gold$#

بعض الأمثلة :

النّمطالنصالنتيجةالشرح
#^b#abcdخطألأن النص abcd يجب أن يبدأ بحرف "b" بدل "a"
#^a#abcdصحيحلأن النص abcd يبدأ بحرف a
#d$#abcdصحيحلأن النص abcd ينتهي بحرف d
#d$#..abcdخطألأن النص abcd يجب أن ينتهي بحرف "d" ، بدل النقطة "."

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

  • preg_match : تتوقف عن البحث عند إيجاد أول نص مطابق للنمط
  • preg_match_all : لا تتوقف عند إيجاد أول تطابق . بل تُكمل البحث حتّى تجد جميع النصوص المُطابقة للنمط

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