regex comment - تحويل علامة إغلاق PHP إلى تعليق




in remove (6)

هناك عدة طرق أخرى تستحق إضافتها إلى كتاب خدعة 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

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

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

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

$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 ، ولكنه مفيد في هذه الحالة (للأسباب المبينة في الإجابات الأخرى).


لماذا لم تنجح محاولاتك:

// $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',...
                                   ^ doesn't work due to ?> ending php

/* $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',... */
                                 ^ doesn't work due to */ closing comment

ما الذي يعمل:

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

بالإضافة إلى ذلك...

بعد ما سبق ، يجب أن تكون قادرًا على استخدام /* للتعليق على الخط. إذا تركت ?> سليمة ، // لا يمكن التعليق على سطر كامل. يمكن أن يكون النص التالي ?> html ، والذي يقع خارج نطاق سيطرة مترجم PHP ، بحيث لا يعمل.

من php.net/manual/en/language.basic-syntax.comments.php

أنماط تعليق "سطر واحد" تعلق فقط على نهاية السطر أو الكتلة الحالية لشفرة PHP ، أيهما يأتي أولاً. وهذا يعني أن شفرة HTML بعد // /؟؟> أو # ...؟> ستتم طباعتها:؟> تنفصل عن وضع PHP وتعود إلى وضع HTML ، و // أو # لا يمكن أن تؤثر على ذلك.


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

في شفرتك:

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

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

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

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

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


لماذا استخدام "الحيل" معقدة ، صعبة القراءة لحل المشكلة؟

? هو مجرد اختصار كميا للراحة ، لذلك

ما عليك سوى استخدام الإصدار الطويل من الكمي {0,1} ، يعني "الحد الأدنى 0 الحد الأقصى لحدوث واحد":

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

بالنسبة لمستخدمي Rubi Mine على نظام Windows:

فتح الملف في المحرر حدد الكتلة ثم اضغط على Ctrl + forward slash ، وسوف تكون قد حددت فقرة تبدأ بـ #.

الآن إذا كنت تريد إلغاء التعليق على المجموعة التي تم التعليق عليها ، اضغط على مجموعة المفاتيح نفسها Ctrl + forward slash مرة أخرى





php regex tags comments