tag - w3schools php comment




تحويل علامة إغلاق PHP إلى تعليق (4)

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

لقد حاولت التعليق على هذا السطر بـ // ، /* */ و # ولكن لا يعمل أي منهم ، يعتبر المحلل أن علامة الإغلاق هي علامة إغلاق فعلية.

هنا هو الخط في السؤال:

$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
//                              ^^             ^^

ما الذي يمكنني فعله للتعليق على الخط أعلاه؟


استخدم خدعة: سلسل السلسلة من قطعتين. بهذه الطريقة ، يتم قطع علامة الإغلاق إلى اثنتين ، وهي ليست علامة إغلاق صالحة بعد الآن. '?>' --> '?'.'>'

في شفرتك:

$string = preg_replace('#<br\s*/?'.'>(?:\s*<br\s*/?'.'>)+#i', '<br />', $string);

وهذا سيجعل // تعليقات العمل.

بالنسبة إلى /* */ التعليقات للعمل ، يجب عليك تقسيم */ تتابع أيضًا:

$string = preg_replace('#<br\s*'.'/?'.'>(?:\s*<br\s*'.'/?'.'>)+#i', '<br />', $string);

تذكر ، في بعض الأحيان ، على الرغم من أن الكل أكثر من مجموع أجزائه - ولكن الجشع أمر سيئ ، هناك أوقات أفضل لك مع أقل . :)


فكرة أخرى: Escape the >/ ، إذا كنت تريد استخدام / comment):

$string = preg_replace('#<br\s*\/?\>(?:\s*<br\s*\/?\>)+#i', '<br />', $string);

يتم تجاهل هروب "غير ضروري" بواسطة محرك regex ، ولكنه مفيد في هذه الحالة (للأسباب المبينة في الإجابات الأخرى).


هناك عدة طرق أخرى تستحق إضافتها إلى كتاب خدعة RegEx :

أولاً ، يمكنك ضغط جهاز RegEx إلى: /(<br\s*/?>)+/i /؟> /(<br\s*/?>)+/i واستبداله <br /> (لا داعي للعبء على RegExP باستخدام lookaheads) وستنتهي دائمًا بـ XHMTL الذي اخترته الخط مقطوع.

طرق أخرى لتعديل نظام RegEx الخاص بك بحيث لا يقوم برحلة */ إنهاء التعليق أو ?> النص البرمجي النهائي:

  • استخدم quantifiers possessive : #(<br\s*+/?+>)+#i - والتي تعني أساساً لـ \s*+ إذا وجدت تطابق whixpace مع وجودها و /?+ إذا كنت وجدت مائل احفظه!
  • تضمين \s* و /* في مجموعات الالتقاط => #(<br(\s*)(/?)>)+#i

العروض المباشرة: http://codepad.viper-7.com/YjqUbi

وبما أننا استندنا إلى السلوك التملكي فإن أسرع ريجكس الذي يتجاوز أيضًا مشكلة التعليق هو: #(<br\s*+/?+>)++#i

كما للتعليق في حالات صعبة

عندما لا يمكنك تغيير الشفرة ، أو سبق لك استخدام تعليق متعدد الأسطر و:

1. استخدم nowdoc :

    $string='Hello<br>World<br><br />World<br><br><br>Word!';
    <<<'comment'
    $string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
comment;

رمز الحية: http://codepad.viper-7.com/22uOtV

ملاحظة: تشبه كلمة nowdoc كلمة heredoc ولكنها لا تقوم بتحليل المحتوى ويجب أن يكون لها محدد يبدأ في ' علامات الاقتباس الفردية ' ( لاحظ أنه لا يمكن تحديد محدد النهاية ويجب أن يتبعه ; وخط جديد ! )

2. القفز فوق الرمز مع الانتقال goto :

$string='Hello<br>World<br><br />World<br><br><br>Word!';
goto landing;
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
landing:

مثال حي: http://codepad.viper-7.com/UfqrIQ

3. القفز فوق الكود مع if(false) أو if(0) :

$string='Hello<br>World<br><br />World<br><br><br>Word!';
if(0){
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
}

الاختبار: http://codepad.viper-7.com/wDg5H5


أسهل طريقة

قم بإنشاء متغير منفصل لاستيعاب تعبيرك العادي. بهذه الطريقة يمكنك ببساطة التعليق على عبارة preg_replace() :

$re = '#<br\s*/?>(?:\s*<br\s*/?>)+#i';
// $string = preg_replace($re, '<br />', $string);

إصلاح باستخدام فئات الشخصيات

لإصلاح تعليقات الخط ، يمكنك التفريق ?> بوضع > داخل فئة شخصية مثل:

$string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i', '<br />', $string);
                                 ^ ^              ^ ^

لإصلاح تعليقات الحظر ، يمكنك تطبيقها على / :

$string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i', '<br />', $string);
                               ^ ^              ^ ^

لإصلاح كلا من أنماط التعليق ، يمكنك وضع / و > في فئة الشخصيات الخاصة بهم.

إصلاح باستخدام معدّل /x

يتجاهل modifier x - المعروف أيضًا باسم PCRE_EXTENDED - المسافات والخطوط الجديدة في تعبير عادي (باستثناء الحالات التي تحدث داخل فئة الأحرف) ؛ هذا يجعل من الممكن إضافة مسافات لفصل الأحرف معضلة. لإصلاح كلا من أنماط التعليقات:

$string = preg_replace('#<br\s* /? >(?:\s*<br\s* /? >)+#ix', '<br />', $string);
                               ^  ^             ^  ^




comments