Одна из строк в моем скрипте содержит закрывающий тег PHP внутри строки. При нормальной работе это не вызывает проблем, но мне нужно закомментировать строку.
Я попытался прокомментировать эту линию //
, /*
*/
и , #
но ни один из них работает, синтаксический анализатор не считает закрывающим тегом , чтобы быть фактическим закрывающим тегом.
Вот эта строка:
$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
// ^^ ^^
Что я могу сделать, чтобы закомментировать вышеприведенную строку?
<?php # echo 'simple';?>
.Ответы:
Используйте хитрость: объедините строку из двух частей. Таким образом, закрывающий тег разрезается пополам и больше не является допустимым закрывающим тегом.
'?>' --> '?'.'>'
В вашем коде:
Это заставит
//
комментарии работать.Чтобы
/* */
комментарии работали, вам также нужно разделить*/
последовательность:Помните, что иногда, даже если целое больше, чем сумма его частей - но жадность - это плохо, иногда вам лучше оставить меньше . :)
источник
??<
Самый простой способ
Создайте отдельную переменную для хранения вашего регулярного выражения; таким образом, вы можете просто закомментировать
preg_replace()
утверждение:Исправлено использование классов персонажей
Чтобы исправить комментарии в строке, вы можете разбить их
?>
, поместив>
в класс символов, например, так:Чтобы исправить комментарии к блоку, вы можете применить его к
/
:Чтобы исправить оба стиля комментариев, вы можете поставить
/
и>
в свой класс символов.Исправить с помощью
/x
модификатораx
Модификатор - он жеPCRE_EXTENDED
- игнорирует пробелы и переводы строк в регулярном выражении (кроме случаев , когда они происходят внутри класса символов); это позволяет добавлять пробелы для разделения проблемных символов. Чтобы исправить оба стиля комментариев:источник
x
модификатор :)g
) ...Почему ваши попытки не сработали:
Что работает:
Дальше...
После всего вышесказанного вы сможете использовать,
/*
чтобы закомментировать строку. Если вы оставите?>
нетронутым,//
не сможете закомментировать всю строку. Следующим текстом?>
может быть html, который находится вне контроля интерпретатора PHP, поэтому он не будет работать.Из документации:
источник
Еще одна идея: избежать
>
(и/
, если вы хотите использовать/*...*/
комментарий):«Ненужное» побег игнорируется механизмом регулярных выражений, но в этом случае полезно (по причинам, изложенным в других ответах).
источник
Зачем использовать сложные, трудно читаемые «хитрости» для обхода проблемы?
?
это просто квантификатор для удобства, такПросто используйте длинную версию квантификатора
{0,1}
, что означает «минимум 0, максимум 1 вхождение»:источник
Несколько других способов, которые стоит добавить в книгу трюков RegEx :
Сначала вы можете сжать свой RegEx до:
/(<br\s*/?>)+/i
и заменить на<br />
(не нужно обременять RegExP заглядыванием в будущее), и у вас всегда будет выбранный разрыв строки XHMTL.Другие способы изменить свой RegEx, чтобы он не отключал
*/
конечный комментарий или?>
конечный скрипт:#(<br\s*+/?+>)+#i
- которые в основном означают, что\s*+
если вы обнаружили, что количество пробелов совпадает с тем количеством, которое существует, и сохраните его, и для/?+
если вы нашли слеш, сохраните его!\s*
и/*
в группы захвата =>#(<br(\s*)(/?)>)+#i
Живые демонстрации: http://codepad.viper-7.com/YjqUbi
И так как мы опирались на собственническое поведение, самый быстрый RegEx, который также обходит проблему комментирования: поясненная демонстрация
#(<br\s*+/?+>)++#i
Что касается комментирования в сложных ситуациях
Если вы не можете изменить код или уже использовали многострочный комментарий и:
1. Используйте nowdoc :
Живой код: http://codepad.viper-7.com/22uOtV
Примечание: а nowdoc похож на Heredoc , но не анализирует содержание и должен иметь это начиная разделитель , заключенный в
'
одинарные кавычки'
( примечание о том , что окончание разделитель не может быть idented , должно сопровождаться;
и новой строки ! )2. Перепрыгните код с помощью перехода :
Живой пример: http://codepad.viper-7.com/UfqrIQ
3. Перепрыгните код с помощью
if(false)
илиif(0)
:Тест: http://codepad.viper-7.com/wDg5H5
источник