مُعدِّلات النمط Pattern Modifiers‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎

من موسوعة حسوب
< PHP

فيما يلي مُعدِّلات PCRE الحالية الممكنة. وتشير الأسماء الموجودة بين قوسين إلى أسماء PCRE الداخلية لها. وتُتَجاهل المسافات والسطور الجديدة في المعدّلات، بينما تتسبب الأحرف الأخرى في حدوث خطأ.

i (PCRE_CASELESS)‎

إذا ضُبِط هذا المُعدِّل، تتطابق الحروف في النمط مع الحروف الكبيرة والصغيرة.

m (PCRE_MULTILINE)‎

تعامل PCRE سلسلةَ الهدف افتراضيًا كما لو كانت مكونة من "سطر" واحد من الحروف (حتى إذا كان يحتوي بالفعل على عدة سطور جديدة). ويتطابق الحرف الخاص "بداية السطر" ورمزه ^ فقط في بداية السلسلة النصية، بينما يتطابق الحرف الخاص "نهاية السطر" ورمزه $ فقط في نهايتها، أو قبل نهاية سطر جديد (إلا إذا ضُبِط المُعدّل D). وهو نفسه ما يحدث مع Perl. وإذا ضُبِط هذا المُعدِّل، تتطابق الصيغتان "بداية السطر" و "نهاية السطر" مباشرة بعد أو مباشرة قبل أي سطر جديد في سلسلة الهدف على التوالي، وكذلك في البداية والنهاية. ويعادل هذا المُعدِّل ‎/m في Perl. في حالة عدم وجود أحرف "‎\n" في السلسلة الهدف، أو عدم وجود ^ أو $ في النمط، فإن إعدادات هذا المُعدِّل ليس لها أي تأثير.

s (PCRE_DOTALL)‎

إذا ضُبِط هذا المُعدِّل، يتطابق حرف النقطة الخاص في النمط مع جميع الحروف، بما في ذلك السطور الجديدة. وبدونه، تُستبعد السطور الجديدة. ويكافئ هذا الُمعدِّل ‎/s في Perl. وتتطابق فئة سالبة مثل ‎[^a]‎ دائمًا مع حرف السطر الجديد، بغض النظر عن إعدادات هذا المُعدّل.

x ( PCRE_EXTENDED )‎

إذا ضُبِط هذا المُعدِّل، فستُتَجاهل أحرف المسافات البيضاء في النمط تمامًا إلا إذا هُرِّبت أو إذا كانت داخل فئة الحرف، وكذلك تُتَجاهل الأحرف بين رمز # غير المُهرَّب خارج فئة الحرف وحتى حرف السطر الجديد التالي له (ويكون مشتملًا عليه). ويكافئ مُعدّل ‎/x في Perl، ويُسمح بتضمين تعليقات داخل الأنماط المعقدة. مع ذلك، لاحظ أن هذا ينطبق فقط على حروف البيانات. وقد لا تظهر الأحرف البيضاء في تسلسلات الحروف الخاصة في النمط، على سبيل المثال ضمن التسلسل ‎(?(‎ الذي يمثل نمطًا فرعيًا شرطيًا.

e (PREG_REPLACE_EVAL)‎

تحذير: أُهمالت هذه الميزة في PHP 5.5.0، وأُزيلت بدءًا من PHP 7.0.0.

إذا ضُبِط هذا المُعدِّل المُهمل، تستبدل الدالة preg_replace()‎‎ المراجع الخلفية بشكل اعتيادي في سلسلة الاستبدال النصية، وتُقيّمه على أنه شفرة PHP، وتستخدم النتيجة لاستبدال سلسلة البحث. ستُهرَّب علامة الاقتباس المفردة وعلامة الاقتباس المزدوجة والشرطة المائلة العكسية (‎\) وحرف NULL بواسطة الشرطة المائلة العكسية في المراجع الخلفية البديلة.

تنبيه: تعمل الدالة addslashes()‎‎ على كل مرجع خلفي مطابق قبل حدوث الاستبدال. على هذا النحو، عند استخدام المرجع الخلفي كسلسلة مقتبسة، تتحول الحروف المُتجاهَلة إلى نفسها حرفيًا. ومع ذلك سوف تحتفظ الحروف المُهرَّبة والتي لا يجب تحويلها عادةً بشرطتها المائلة. الأمر الذي يجعل استخدام هذا المعدل معقدًا للغاية.

تنبيه

تأكد من أن replacement يشكل سلسلة صالحة لشيفرة PHP، وإلا سوف يشكو PHP من خطأ في التحليل في السطر الذي يحتوي على preg_replace()‎‎.

تنبيه: استخدام هذا المُعدِّل غير مُحبَّذ، نظرًا لأنه قد يسبب ثغرات أمنية بسهولة:

<?php
$html = $_POST['html'];

// uppercase headings
$html = preg_replace(
    '(<h([1-6])>(.*?)</h\1>)e',
    '"<h$1>" . strtoupper("$2") . "</h$1>"',
    $html
);

يمكن استغلال شيفرة المثال أعلاه بسهولة عن طريق تمرير لها سلسلة نصية مثل <h1>{${eval($_GET[php_code])}}</h1>. الأمر الذي يعطي المُهاجم القدرة على تنفيذ شيفرة PHP عشوائيًا، وعلى هذا النحو يتيح له الوصول الكامل تقريبًا لخادمك. لمنع هذا النوع من ثغرات تنفيذ التعليمات البرمجية عن بُعد، يجب استخدام الدالة preg_replace_callback()‎‎ بدلاً من ذلك:

<?php
$html = $_POST['html'];

// uppercase headings
$html = preg_replace_callback(
    '(<h([1-6])>(.*?)</h\1>)',
    function ($m) {
        return "<h$m[1]>" . strtoupper($m[2]) . "</h$m[1]>";
    },
    $html
);

ملاحظة: فقط الدالة preg_replace()‎‎ تستخدم هذا المًعدِّل؛ بينما تتجاهلها دوال PCRE الأخرى.

A (PCRE_ANCHORED)‎

إذا ضُبِط هذا المُعدِّل، سيُفرّض على النمط أن يكون "مُرتكِزًا"، أي أن يكون مقيَّدًا بحيث يتطابق فقط عند بداية السلسلة المراد البحث فيها ("السلسلة الهدف"). ويمكن تحقيق هذا التأثير أيضًا من خلال التركيبات المناسبة في النمط نفسه، وهو الطريقة الوحيدة لفعل ذلك في Perl.

D (PCRE_DOLLAR_ENDONLY)‎

إذا ضُبِط هذا المُعدِّل، يتطابق الحرف الخاص $ في النمط فقط في نهاية سلسلة الهدف. وبدون هذا المُعدِّل، يتطابق رمز $ أيضًا مباشرة قبل الحرف الأخير إذا كان السطر جديدًا (ولكن ليس قبل أي سطر جديد آخر). ويُتَجاهل هذا المُعدِّل إذا ضُبط المُعدِّل m. ولا يوجد ما يُكافئ هذا المعدل في Perl.

S

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

U (PCRE_UNGREEDY)‎

يُغيّر هذا المُعدِّل من "جشع (greediness)" المُحدِدات الكَمّية بحيث لا تكون جشعة بشكل افتراضي، بل تصبح جشعة إذا تبعها الرمز ?. وهو غير متوافق مع Perl. ويمكن أيضًا أن يحدد بواسطة إعدادات المُعدِّل في النمط(?U)‎ أو علامة استفهام وراء مُحدِد الكمية (على سبيل المثال. ‎*?‎ ).

ملاحظة: عادة ما يكون غير ممكن مطابقة أكثر من عدد يساوي pcre.backtrack_limit حرف في الوضع غير الجشع (ungreedy).

X (PCRE_EXTRA)‎

يُفعِّل هذا المُعدِّل وظائف إضافية لـ PCRE غير المتوافقة مع Perl. وتتسبب أي شرطة مائلة عكسية في نمط يتبعه حرف ليس له معنىً خاصًا في حدوث خطأ، وبالتالي حجز هذه المجموعات للتوسعات المستقبلية. وبشكل افتراضي، وكما هو الحال في Perl، تُعامَل الشرطة المائلة العكسية المتبوعة بحرف بدون معنى خاص على أنه الحرف ذاته حرفيًا. ولا يتحكم هذا المُعدِّل حاليًا بأي ميزات أخرى.

J (PCRE_INFO_JCHANGED)‎

ضبط الخيار ‎(?J)‎ يغير إعدادات الخيار الداخلي لخيار PCRE_DUPNAMES المحلي. يسمح بأسماء مكررة للأنماط الفرعية. واعتبارًا من PHP 7.2.0 يُدعم J كمُعدِّل أيضًا.

u (PCRE_UTF8)‎

يُفعِّل هذا المُعدِّل وظائف إضافية لـ PCRE غير المتوافقة مع Perl. وتُعامل الأنماط وسلاسل الهدف على أنها UTF-8. ستؤدي سلسلة هدف غير صالحة إلى عدم تطابق الدالة preg_*‎ مع أي شيء؛ وسيؤدي نمط غير صالح إلى حدوث خطأ بالمستوى E_WARNING. وتُعد التسلسلات خمسة و ستة الثُمانية من UTF-8 غير صالحة منذ PHP 5.3.4 ‎(resp. PCRE 7.3 2007-08-28)‎؛ وكانت تُعد سابقا كتسلسلات UTF-8 صالحة.

مصادر