Несколько других способов, которые стоит добавить в книгу трюков 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 :
$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 , но не анализирует содержание и должен иметь это начиная разделитель , заключенный в 'одинарные кавычки '( примечание о том , что окончание разделитель не может быть idented , должно сопровождаться ;и новой строки ! )
2. Перепрыгните код с помощью перехода :
$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