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

مُعامِلات التكرار

آخر تحيين: 27-04-2014

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


سنبدأ بمثال ربما راودكم ، و قد تجنّبته لغاية الآن ، و هو إمكانية توظيف رمزي بداية و نهاية النص في نفس النمط كالتالي :
#^[a-z]$#
النمط يعني أننا نريد لنصنا أن يبدأ بحرف صغير و ينتهي بحرف صغير . هذا الإستنتاج قد توصلتم إليه بدون شك . لكن ما قد يثير البلبلة للبعض ، هو أن هذا النمط صحيح في حالة واحدة : إذا كان نصنا لا يتجاوز حرفا واحدا ، لا غير . مثال :

النمطالنصالنتيجة
#^[a-z]$#it was in aprilخطأ
#^[a-z]$#abخطأ
#^[a-z]$#aصحيح
#^[a-z]$#bصحيح

في الكثير من الأحيان ، عند إنشاء أنماطكم ، ستحتاجون لتوظيف الرّمزين . لكن ما الجدوى إذا كنا سنبحث في نص يتكون من حرف واحد . إطمئنّوا ، توجد مُعامِلات تُتيح لنا البحث عن نصوص طويلة حسب حاجتنا . و هذه المُعامِلات ، أغلبهاسبق لكم التعرف عليها و هي ثلاثة : "+" و "*" و "?" : علامة زائد و نجمة و علامة استفهام
تسمّى هذه العلامات "معاملات التكرار" . لأنها تتيح لنا اختيار و تحديد عدد المرات التي نريد لمكونات النص أن تتكرر

  1. ? : مرّة واحدة أو لا شيء .
    تعني أن نقبل بتكرار المُكوّن إمّا مرّة واحدة أو لاشيء
    مثال 1 : #tw?o# : أتحنا البحث عن الكلمتين "two" أو "to" . حرف "w" يبقى ثانويا .
    مثال 2 : #https?# : "http" أو "https"
  2. + : مرّة واحدة أو أكثر .
    المُكوّن إجباري ، يجب أن يتكرر على الأقل مرّة واحدة
    مثال : #a+# : حرف a واحد أو أكثر "a" أو "aa" أو "aaa" أو "aaaaaaaaa" ...إلخ
    لنأخذ الآن مثالنا السابق ، و نجعله يُتيح لنا البحث على أكثر من مُكوّن :
    #^[a-z]+$# . بإضافة علامة زائد بعد المصفوفة ، هذا يعني أننا نتيح لكل ما يوجد داخل المصفوفة إمكانية أن يتكرّر مرّة واحدة أو أكثر
  3. . : تُتيح جميع مُكوّنات النص ، ما عدا رمز الرجوع للسّطر \n . (النقطة ليست من معاملات التكرار ، أدرجتها لتتعرفون عليها )
    مثال : #^.+$# : أتحنا استعمال جميع مُكوّنات النص التي تعرفونها ، من حروف و رموز و حركات و فراغات ...إلخ . في بداية و نهاية النص . ما عدا رمزا واحدا و هو "n\"
  4. * : صفر مرّة أو مرّة واحدة أو أكثر .
    المُكوّن ليس إجباريا هنا ، مما يجعل منه الإختلاف الوحيد مع معامل "زائد"

إذا أردنا مثلا لمكونات مُحدّدة أن تتكرّر دون غيرها ، نضعها بين قوسين "()" . مثال :
لنأخذ الكلمة "lol" و نقوم بتكرار الحرف "o"
#l(o)+l# : أتحنا جميع كلمات lol التي تتضمن على الأقل حرف "o" واحدا . لأن هذا الأخير إجباري ما دام استعملنا علامة زائد . سنحصل على : "lol" أو "lool" أو "loooooooooooooool, ...إلخ .
هذا يحيلنا إلى السّؤال التالي :
كيف سنتصرّف إذا أردنا تكرار مُكوّن ما ، عددا مُحدّدا من المرّات ؟
في هذه الحالة سنستغني عن علامة زائد و النجمة و سنستبدلهما باللاّمّتين "{}" . ثم سنقوم بتحديد عدد المرّات التي نريد للمكون أن يتكرّر . لهذا لدينا ثلاث خيارات :
ـ {2} : إذا وضعنا رقما واحدا بين اللامتين ، فهو يعني عدد مرّات التكرار بالتحديد . مرّتين في مثالنا .
ـ {2,4} : إذا وضعنا رقمين ، نُحدّد بذلك حيّزا لعدد مرات التكرار ، مثلا من مرّتين إلى أربع مرّات لا أقل و لا أكثر .
ـ {2,} : إذا وضعنا رقما متبوعا بفاصلة دون أن نضع الرّقم الثاني : فهذا يعني إتاحة التكرار بدءا من الرقم الذي عيّناه إلى ما لا نهاية
في مثالنا سيتكرّر المكوّن مرّتين أو أكثر .
بعض الأمثلة :

  • #a{2}# : أتحنا تكرار حرف "a" مرّتين بالضبط . أي "aa" فقط
  • #l(o){1,3}l# : سنقبل إما "lol" أو "lool" أو "loool" لا غير .
  • #a{1,}# : سنقبل إما "a" أو "aa" أو "aaa" أو "aaaaaaaaaaaaaaaaaaa" إلى ما لا نهاية .

يمكننا أيضا تطبيق نفس الشيء على المصفوفات . مثال :
#[a-z]{2,4}# : أتحنا إمّا حرفين أو ثلاثا أو أربعا من الحروف الصغيرة .