[mod_rewrite] التعابير المنتظمة

مدرج تحت قسم: دروس
14 يناير 2007

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

ثانياً : اعتقد ان البعض قرأ مقالي السابق الـ mod_rewrite ، تفاصيل أكثر، ولكن المقال لم يكن كافي، حيث تبقى شرط التعابير المنتظمة “Regular Expressions” ضمن الـ mod_rewrite.

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

التعابير المنتظمة – Regular Expressions

الاستخدامات

في كثير من لغات البرمجة منها:

  • Java
  • JavaScript
  • .NET (dot net)
  • Perl
  • PHP
  • Python
  • Ruby

ولا ننسى استخدامها مع خادم apache عبر الـ mod_rewrite.

كمّا انوه انني لا اعلم بمدى تشابه واختلاف استخدامها بين اللغات السابقة ، ولكن في اعتقادي الخاص انها تملك قواعد وانماط متقاربة بشكل كبير، وهنا سوف يكون الشرح معتمد بشكل اساسي على الـPHP.

الوظيفة

التعبير المنتظم يعتبر قالب بنائي لتراكيب بعض الجمل، حيث يستخدم للتحقق من توافق الجمل مع التركيب البنائي الذي تم تحديده للتعبير.

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

كذلك جزء آخر بعد العلامة يتكون من احرف وارقام وعلامات خاصة ثم نقطة يليها امتداد الموقع امّا com أو net أو غيرها من الامتدادات الحالية.

الرموز الخاصة

تنقسم الرموز إلى مجموعتين تبعاً لمكان وجودها، المجموعة الأولى الرموز خارج الاقواس المربعة ، والثانية الرموز داخل الاقواس المربعة.

توضيح : الاقواس المربعة هي الاقواس [ و ] .
المجموعة الأولى – خارج الاقواس المربعة

^

لتحديد بداية التعبير.

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

$

لتحديد نهاية التعبير.

علامة الدولار $ ، توضح انتهاء التعبير وان لا شيء متوقع ان يكون بعد ذلك.

^devpedia$

التعبير السابق لن يتطابق الا مع الكلمة devpedia ، حيث لن يتطابق مع أي كلمة آخرى مثل wdevpedia أو حتى devpediaw، لأن الاخيرتين يسبقها بحرف أو تزيد عليها حرف في آخرها ولإتاحة امكانية ان تحتوي الكلمة احرف سابقة أو لاحقة كل ما عليك هو الاستغناء عن رمزي التحديد أو احدهما كما ترغب.

.

لتعيين مكان لرمز مجهول.

النقطة يمكن ان تعبر عن أي حرف أو رمز غير معلوم مسبقا، لنوضح ذلك عبر التعبير التالي:

^.at$

نلاحظ ان الخانة الأولى في التعبير كانت هي النقطة ، وهنا يمكن ان يطابق التعبير الكلمات التالية : cat, hat, fat واي كلمات تتكون من ثلاثة احرف الثاني والثالث هنا هو at ، أو حتى يمكن ان يكون الحرف الأول مسافة أو رمز فسوف يكون التعبير متطابق مع الكلمة.

كما انه يمكن ايضاً وضع العديد من النقاط حسب الرغبة وحسب عدد الاحرف غير المعلومة في الكلمة ، حيث يمكن ان يكون التعبير السابق بالشكل التالي:

^..at$

وهي في هذه الحالة تحتمل جميع الكلمات التي تتكون من اربعة احرف وتنتهي بـ at مثل الكلمة : heat. وهكذا…

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

[

لبداية تصنيف رموز جديد.

]

لإنهاء تصنيف الرموز.

الاقواس المربعة السابقة مهمة بالنسبة للتعابير المنتظمة ، ووظيفتها جمع عدد من الرموز التي يحتمل وجودها ضمن الجمل التي يتم مطابقتها معها.

مثلاً:

^[abcdef]$

هذا التعبير يستخدم للكشف عن حرف واحد ليتحقق من تواجده ضمن المجموعة السابقة ام لا ، امّا عن كيفية الكشف عن أكثر من حرف (أي كلمة مثلاً) فعلينا تكرار القوس المربع بما يحويه لأكثر من مرة كما يلي:

^[abcdef][abcdef][abcdef][abcdef]$

حيث ان هذا يمثل كلمة تتكون من اربعة احرف لا تخرج احرفها عن a, b, c, d, e, f مع ملاحظة انه يمكن تغيير القوس الأول بالإحتمالات الخاصة بالحرف الأول والقوس الثاني كذلك بما يخص الحرف الثاني ، وهكذا.

لكن هذا صعب جداً من ناحيتين:

  • أولاً: الاحرف التي سوف يتم تضمينها داخل القوس المربع ، ولا ننسى انها متاحة كذلك للأرقام والرموز ، فهل سوف يتم سرد الجميع داخل القوس؟

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

تنويه : لا انسى ان انبه انه يمكن تضمين الاقواس المربعة الحروف أو الارقام كما ذكرت كما يلي:

^[ie8392%&3f]$
  • المشكلة الثانية، سوف تكون عملية تكرار الاقواس صعبة إذا كنت اعلم عدد احرف الكلمة ، فكيف سوف يكون الحال ايضاً إذا لم اكن اعلم عدد احرف الكلمة؟

لا تخشى ذلك ايضاً، ففي خاصية التكرار الحل لذلك، تابع قراءة الرموز ولا تقلق.

|

لوضع عدة اختيارات.

في بعض الاحيان تكون هناك عملية تخيير بين كلمتين يمكن ان تكون موجودة لا ثالث لهما ، في هذه الحالة يمكن استخدام رمز الخط العمودي | لهذه المهمة.

^com|net$

هذا التعبير سوف يطابق أي واحدة من الكلمتين com أو net.

(

لبداية نمط فرعي.

)

لإنهاء نمط فرعي.

والأنماط الفرعية يتم وضعها للفصل بين بعض الأنماط المختلفة فتكون اختيارية لعملية الترتيب ، أو تكون اجبارية لعملية التحديد أو ازالة بعض المشاكل.

{a,b}

قوس التكرار.

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

حيث a هو أقل عدد مرات للظهور ، فيمكن ان يكون صفراً (0) حيث تكون احتمالية الظهور تبدأ من صفر إلى b وهو الحد الاعلى لإحتمالية الظهور ، فيمكن ازالته وتركه فارغاً لجعل الحد الاعلى غير محدود.

لا انسى ان اذكر ان هناك اختصارات متعارف عليها بدلاً من كتابة كامل الاقواس وهي:

* = {0,}

النجمة، وتعني ان ما سبقها قد يكون غير موجود أو موجود بعدد مرات غير محدود.

+ = {1,}

اشارة الجمع، وتعني ان ما سبقها على الاقل يكون موجود مرّة واحدة أو اكثر.

? = {0,1}

علامة الاستفهام، وتعني انه انّ وجد ، فهو موجود لمرّة واحدة فقط.

\

علامة التجاهل.

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

المجموعة الثانية – داخل الاقواس المربعة

\^-

والرموز الاخرى تعتبر كـ ثوابت ، أي كأنها احرف أو ارقام.

\

علامة التجاهل.

نفس وظيفة علامة التجاهل السابقة تماماً ، ولكن داخل الاقواس المربعة.

^

رمز النفي. ويجب ان يكون مباشرة بعد قوس الابتداء [ ، وإلاّ اعتبر رمز ثابت مثل الحروف والأرقام.

وظيفته : يرفض النص الذي يحتوي على الرموز الموجودة داخل القوس المربع ، أي يقوم بعكس دوره ، حيث يستفاد منه في البحث عن الشيفرات الضارة في الـ php والحاوية على نصوص مثل script.

-

رمز المدى. يستخدم بدلاً من كتابة جميع الاحرف ، فيكتب على الشكل a-z ، وكذلك للأرقام فتكتب 0-9 ، ولا اعلم ان هناك اشياء آخرى يعبر عنها بطريقة المدى.

مثال موسع:

لنقوم بإنشاء تعبير يتحقق من صحة عنوان موقع وتوافقه للشروط التالية:

- يبدأ بعبارة www.
- ينتهي بأحد الامتدادين .com أو .net أو .org.
- عدد احرف النطاق مابي 1 إلى 5 احرف كحد اقصى.

الحل:

لنفرض عنوان موقع لنطبق عليه تجاربنا ولنقول انه: www.w-r.org

هل نحن بحاجة إلى استخدام رمزي البداية ^ و النهاية $ ؟

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

ماذا عن الـ www. ، كيف سوف يتم كتابتها؟

سوف يتم كتابتها كما هي داخل التعبير حيث يصبح شكل التعبير كما يلي:

www.$

ماذا الآن عن احرف النطاق؟ كيف سوف يتم وضعها؟

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

www.[a-z]$

لكن هذا لن يقبل النطاقات التي يزيد عدد احرف نطاقها عن حرف واحد!

عبر استخدام الاقواس المعقوفة (اقواس التكرار) يمكن حل هذه المشكلة وتحديد الحدد الادنى للأحرف بحرف واحد ، والحد الاعلى بـ 5 احرف.

www.[a-z]{1,5}$

ممم ... جميل ، لكن ماذا إذا تضمن اسم النطاق ارقاماً؟ هل سوف يتعرف عليه التعبير؟

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

www.[a-z0-9]{1,5}$

والآن ... كيف سوف يتم إضافة الاحتمالات الموجودة الخاصة بإمتداد النطاق؟

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

www.[a-z0-9]{1,5}.com|net|org$

لحظة ، عند تجربة ما سبق سوف يظهر خطاءاً فضيعاً ، حيث سوف يقبل النطاق فقط إذا انتهى بالإمتداد com أو عندما لا تكتب النطاق بل تكتب net أو org!

صحيح ، وهنا نجد فائدة استخدام الاقواس الدائرية (اقواس الآنماط الفرعية) حيث بعد تعديل التعبير يصبح:

www.[a-z0-9]{1,5}.(com|net|org)$

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

جميل جميل فعلاً. بقيت نقطة قبل الاخيرة، عند التجربة وكتابة عنوان الموقع بالشكل التالي wwwww-r.org تم قبوله من قبل التعبير بدون اشكال ، ما السبب والحل؟

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

ولحل هذه المشكلة يتم استخدام رمز التهريب الذي يتجاهل الرمز الذي يليه مباشرة ويعتبره ثابت، فبعد التعديل نحصل على التعبير:

www\.[a-z0-9]{1,5}\.(com|net|org)$

فعلاً رائع ، والآن النقطة الاخيرة. تعبيرنا لن يقبل النطاقات التي تحوي علامة الطرح (-)، فما هو الحل؟

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

www\.[a-z0-9\-]{1,5}\.(com|net|org)$

وبذلك وصلنا إلى نهاية المثال وحصلنا على التعبير المناسب.

بقي الجزء الاخير وهو تطبيق التعابير المنتظمة من خلال اماكن استخدامها، وسوف نقوم بإذن الله بالتطبيق عبر الـ mod_rewrite وكذلك عبر الـ php ولكن في المقال التالي والأخير بإذن الله تحت عنوان "تطبيقات التعابير المنتظمة".

للكاتب ابو خالد

  • Share/Bookmark

التعقيبات

  1. غير معروف
  2. غير معروف

التعليقات (3) على ”[mod_rewrite] التعابير المنتظمة“

  1. بانتظار التطبيقات

  2. الامبراطـور

    مقال رااائع ,,

    سيتم وضع التطبيق قريباً ان شاء الله :)

  3. مالك

    شكرا

أضف تعليقك




يمكنك استخدام الوسوم التالية في التعليق: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


* حقول مطلوبة