السلام عليكم ورحمة الله وبركاته،
أولاً : أعتذر عن الانقطاع الطويل الذي حصل دون سابق انذار :)، ولكن هذه ايضاً عودة مؤقتة لكم لنتواصل معكم ثم نعود للإنقطاع مرة اخرى، ولكن هذه المرة سوف تكون بعد اخباركم :D، والحمد لله على كل حال.
ثانياً : اعتقد ان البعض قرأ مقالي السابق "الـ mod_rewrite ، تفاصيل اكثر (1)"، ولكن المقال لم يكن كافي، حيث تبقى شرط التعابير المنتظمة "Regular Expressions" ضمن الـ mod_rewrite.
ولكن حيث ان التعابير المنتظمة هي ليست خاصة بالـ mod_rewrite فسوف اقوم بالحديث عنها بشكل عام مع ذكر بعض اماكن الاستخدام الخاصة بها وامثلة على ذلك.
التعابير المنتظمة - Regular Expressions
الاستخدامات
في كثير من لغات البرمجة منها:- Java
- java script
- .NET (dot net)
- Perl
- PHP
- Python
- Ruby
ولا ننسى استخدامها مع خادم apache عبر الـ mod_rewrite.
كمّا انوه انني لا اعلم بمدى تشابه واختلاف استخدامها بين اللغات السابقة ، ولكن في اعتقادي الخاص انها تملك قواعد وانماط متقاربة بشكل كبير، وهنا سوف يكون الشرح معتمد بشكل اساسي على الـPHP.
الوظيفة
التعبير المنتظم يعتبر قالب بنائي لتراكيب بعض الجمل، حيث يستخدم للتحقق من توافق الجمل مع التركيب البنائي الذي تم تحديده للتعبير.
فمثلاً يتم استخدام التعبير المنتظم للتحقق من صحة بناء عنوان البريد الإلكتروني ، حيث لا يوجد بريد الكتروني الا ويتكون من @ وجزء قبلها يمكن ان يكون احرف او ارقام او العلامات التالية _ و .
كذلك جزء آخر بعد العلامة يتكون من احرف وارقام وعلامات خاصة ثم نقطة يليها امتداد الموقع امّا com او net او غيرها من الامتدادات الحالية.
الرموز الخاصة
تنقسم الرموز الى مجموعتين تبعاً لمكان وجودها، المجموعة الاولى الرموز خارج الاقواس المربعة ، والثانية الرموز داخل الاقواس المربعة.توضيح : الاقواس المربعة هي الاقواس [ و ] .
المجموعة الاولى - خارج الاقواس المربعة
الرمز ^ او كما يسميها البعض الثمانية، او علامة الأس في البرمجة، توضح ان ما بعدها يعتبر هو بداية السطر او الجملة وأن لا شيء يسبقه.
علامة الدولار $ ، توضح انتهاء التعبير وان لا شيء متوقع ان يكون بعد ذلك.
التعبير السابق لن يتطابق الا مع الكلمة devpedia ، حيث لن يتطابق مع اي كلمة اخرى مثل wdevpedia او حتى devpediaw، لأن الاخيرتين يسبقها بحرف او تزيد عليها حرف في آخرها ولإتاحة امكانية ان تحتوي الكلمة احرف سابقة او لاحقة كل ما عليك هو الاستغناء عن رمزي التحديد او احدهما كما ترغب.
النقطة يمكن ان تعبر عن اي حرف او رمز غير معلوم مسبقا، لنوضح ذلك عبر التعبير التالي:
نلاحظ ان الخانة الاولى في التعبير كانت هي النقطة ، وهنا يمكن ان يطابق التعبير الكلمات التالية : cat, hat, fat واي كلمات تتكون من ثلاثة احرف الثاني والثالث هنا هو at ، او حتى يمكن ان يكون الحرف الاول مسافة او رمز فسوف يكون التعبير متطابق مع الكلمة.
كما انه يمكن ايضاً وضع العديد من النقاط حسب الرغبة وحسب عدد الاحرف غير المعلومة في الكلمة ، حيث يمكن ان يكون التعبير السابق بالشكل التالي:
وهي في هذه الحالة تحتمل جميع الكلمات التي تتكون من اربعة احرف وتنتهي بـ at مثل الكلمة : heat. وهكذا...
انتبه الى انه يجب ان يتطابق عدد النقاط مع عدد الخانات المجهولة دون زيادة او نقص في الوقت الحالي، لأنه سوف نتحدث ان شاء الله عن كيفية التغلب على هذه المشكلة عندما نتحدث عن التكرار.
الاقواس المربعة السابقة مهمة بالنسبة للتعابير المنتظمة ، ووظيفتها جمع عدد من الرموز التي يحتمل وجودها ضمن الجمل التي يتم مطابقتها معها.
مثلاً:هذا التعبير يستخدم للكشف عن حرف واحد ليتحقق من تواجده ضمن المجموعة السابقة ام لا ، امّا عن كيفية الكشف عن اكثر من حرف ( اي كلمة مثلاً ) فعلينا تكرار القوس المربع بما يحويه لأكثر من مرة كما يلي:
حيث ان هذا يمثل كلمة تتكون من اربعة احرف لا تخرج احرفها عن a, b, c, d, e, f مع ملاحظة انه يمكن تغيير القوس الاول بالإحتمالات الخاصة بالحرف الاول والقوس الثاني كذلك بما يخص الحرف الثاني ، وهكذا.
لكن هذا صعب جداً من ناحيتين:
- اولاً : الاحرف التي سوف يتم تضمينها داخل القوس المربع ، ولا ننسى انها متاحة كذلك للأرقام والرموز ، فهل سوف يتم سرد الجميع داخل القوس؟
لا طبعاً سوف نتعرف اداة المدى التي سوف تسهل المهمة
عندما نتحدث عن الرموز الخاصة بالأقواس المربعة.
تنويه : لا انسى ان انبه انه يمكن تضمين
الاقواس المربعة الحروف او الارقام كما ذكرت كما يلي:
- المشكلة الثانية، سوف تكون عملية تكرار الاقواس صعبة اذا كنت اعلم عدد احرف الكلمة ، فكيف سوف يكون الحال ايضاً اذا لم اكن اعلم عدد احرف الكلمة؟
لا تخشى ذلك ايضاً، ففي خاصية التكرار الحل لذلك، تابع قراءة الرموز ولا تقلق :).
في بعض الاحيان تكون هناك عملية تخيير بين كلمتين يمكن ان تكون موجودة لا ثالث لهما ، في هذه الحالة يمكن استخدام رمز الخط العمودي | لهذه المهمة.
والأنماط الفرعية يتم وضعها للفصل بين بعض الأنماط المختلفة فتكون اختيارية لعملية الترتيب ، او تكون اجبارية لعملية التحديد او ازالة بعض المشاكل.
وهذا القوس يوضع بجوار القوس المربع او القوس الدائري او حتى الحروف
والرموز والارقام ، وكذلك بجوار النقطة لتفادي المشكلة
عندما لا نعلم مرات التكرار تحديداً كما صادفتنا عند شرح
النقطة فيما سبق.
حيث a هو اقل عدد مرات للظهور ، فيمكن ان يكون صفراً (0)
حيث تكون احتمالية الظهور تبدأ من صفر الى b وهو الحد
الاعلى لإحتمالية الظهور ، فيمكن ازالته وتركه فارغاً لجعل
الحد الاعلى غير محدود.
لا انسى ان اذكر ان هناك اختصارات متعارف عليها بدلاً من كتابة كامل الاقواس وهي:
بعض الاحيان ، نجبر على استخدام بعض الرموز الخاصة بالتعابير المنتظمة ليس لتأدي العمل المناط بها ، وإنما لتكون كـ عنصر ثابت، كأستخدام علامة الدولار داخل النص في عملية التدقيق ان المبلغ بالدولار وينتهي برمز الدولار ، في هذه الحالة يجب ان تسبق علامة الدولار بالرمز \ حتى يتم تجاهل علامة الدولار من مهمتها واعتبارها جزء من النص. اعتقد سوف يكون ذلك اوضح بوجود المثال اللاحق.
المجموعة الثانية - داخل الاقواس المربعة
والرموز الاخرى تعتبر كـ ثوابت ، اي كأنها احرف او ارقام.
نفس وظيفة علامة التجاهل السابقة تماماً ، ولكن داخل الاقواس المربعة.
ويجب ان يكون مباشرة بعد قوس الابتداء [ ، وإلاّ اعتبر رمز ثابت مثل
الحروف والأرقام.
وظيفته : يرفض النص الذي يحتوي على الرموز الموجودة داخل
القوس المربع ، اي يقوم بعكس دوره ، حيث يستفاد منه في
البحث عن الشيفرات الضارة في الـ php والحاوية على نصوص
مثل script.
يستخدم بدلاً من كتابة جميع الاحرف ، فيكتب على الشكل a-z ، وكذلك للأرقام فتكتب 0-9 ، ولا اعلم ان هناك اشياء اخرى يعبر عنها بطريقة المدى.
مثال موسع:
لنقوم بإنشاء تعبير يتحقق من صحة عنوان موقع وتوافقه للشروط التالية:- يبدأ بعبارة www.
- ينتهي بأحد الامتدادين .com او .net او .org.
- عدد احرف النطاق مابي 1 الى 5 احرف كحد اقصى.
الحل:
لنفرض عنوان موقع لنطبق عليه تجاربنا ولنقول انه: www.w-r.org- هل نحن بحاجة الى استخدام رمزي البداية ^ و النهاية $ ؟
اعتقد اننا لسنا بحاجة الى رمز سوف البداية حيث قد يكون في عنوان الموقع http:// في بدايته ، واضافة رمز البداية يمنعنا من ذلك. امّا رمز النهاية فهو شيء جيد ، حتى يمنع المستخدم من ادخال اي اضافة اكثر من عنوان الموقع الرئيسي.
- ماذا عن الـ www. ، كيف سوف يتم كتابتها؟
سوف يتم كتابتها كما هي داخل التعبير حيث يصبح شكل التعبير كما يلي:
- ماذا الآن عن احرف النطاق؟ كيف سوف يتم وضعها؟
بكل بساطة ، سوف نقوم بإستخدام الأقواس المربعة حيث يتم تضمين الاحرف ، ولكن لن نكتب جميع الاحرف وإنما نكتبها بإستخدام رمز المدى - (علامة الطرح)، فيصبح شكل التعبير الخاص بنا كما يلي:
- لكن هذا لن يقبل النطاقات التي يزيد عدد احرف نطاقها عن حرف واحد.. !!
عبر استخدام الاقواس المعقوفة (اقواس التكرار) يمكن حل هذه المشكلة وتحديد الحدد الادنى للأحرف بحرف واحد ، والحد الاعلى بـ 5 احرف.
- ممم ... جميل ، لكن ماذا اذا تضمن اسم النطاق ارقاماً؟ هل سوف يتعرف عليه التعبير؟
بالطبع لا، ولحل هذه المشكلة ندرج مجموعة الارقام من 0 الى 9 عبر استخدام المدى داخل الاقواس المربعة فيصبح تعبيرنا كما يلي:
- والآن ... كيف سوف يتم اضافة الاحتمالات الموجودة الخاصة بإمتداد النطاق؟
الامر في غاية البساطة، اولاً نضيف النقطة الموجودة قبل الامتداد... ثم بعد ذلك اضافة جميع الامتدادات مستخدماً رمز تعدد الاختيارات | (الخط العمودي) فيصبح تعبيرنا هكذا:
- لحظة ، عند تجربة ما سبق سوف يظهر خطاءاً فضيعاً ، حيث سوف يقبل النطاق فقط اذا انتهى بالإمتداد com او عندما لا تكتب النطاق بل تكتب net او org ... :( ... !!
صحيح ، وهنا نجد فائدة استخدام الاقواس الدائرية (اقواس الانماط الفرعية) حيث بعد تعديل التعبير يصبح:
وبذلك تصبح عملية التبديل محدودة بما بين الاقواس، ومن يستخدم الآلة الحاسبة العلمية سوف يجد تشابه في استخدام الأقواس عند كتابة عمليات كثيرة حتى لا يواجه خلل في الحساب.
- جميل جميل فعلاً ... بقيت نقطة قبل الاخيرة ، عند التجربة وكتابة عنوان الموقع بالشكل التالي wwwww-r.org تم قبوله من قبل التعبير بدون اشكال ، ما السبب والحل؟
فعلاً هذا يحدث ، والسبب ان التعبير اعتبر النقطة التي
ذكرناها بمثابة حرف او رمز عام يمكن استخدام اي رمز وسوف
يتم قبوله ، وكذلك سوف يتم التعامل مع النقطة الثانية
الموجودة ومع اي رمز من قائمة الرموز الخاصة اذا اريد
استخدامه كـ رمز ثابت.
ولحل هذه المشكلة يتم استخدام رمز التهريب الذي يتجاهل
الرمز الذي يليه مباشرة ويعتبره ثابت، فبعد التعديل نحصل
على التعبير:
- فعلاً رائع ، والآن النقطة الاخيرة ... تعبيرنا لن يقبل النطاقات التي تحوي علامة الطرح (-)، فما هو الحل؟
كما ذكرنا ، اي رموز او امور خاصة في النطاق نفسه يتم تضمينها داخل الاقواس المربعة في مثالنا هذا تقريباً، وبعد تضمين علامة الطرح (-) في التعبير لا ننسى وضع علامة التهريب قبله تفادياً لأية مشكلة لأن علامة الطرح من الرموز الخاصة بالاقواس المربعة.
وبذلك وصلنا الى نهاية المثال وحصلنا على التعبير المناسب.
بقي الجزء الاخير وهو تطبيق التعابير المنتظمة من خلال اماكن استخدامها، وسوف نقوم بإذن الله بالتطبيق عبر الـ mod_rewrite وكذلك عبر الـ php ولكن في المقال التالي والأخير بإذن الله تحت عنوان "تطبيقات التعابير المنتظمة" :).
والسلام عليكم ورحمة الله وبركاته.