2016-09-05 3 views
4

Я пробовал в течение 2 часов, но я не могу нормально обрабатывать регулярное выражение. Я хотел бы заменить все html-комментарии на строку, но только в том случае, если в строке NOT сразу же применяется тег <br>.Preg_replace str, если сразу не следует str

У меня есть следующие работает хорошо уже, чтобы удалить все HTML комментарии из строки:

preg_replace('/<!--.*?-->/s', '', $str); 

Я пытаюсь добавить так, что комментарий не будет заменен, если он сразу же наследовал <br> теге. Я что-то вроде этого (очевидно, неправильно) думать, но не могу обернуть мою голову вокруг него:

preg_replace('/<!--.*?-->(?!<br>)/s', '', $str); 

Любое руководство оценили.

+0

, пожалуйста, отправьте пример того, что у вас есть, и чего вы хотите достичь. –

ответ

2

Пункт ленивой точки будет соответствовать как можно меньше символов до первой подстроки, соответствующей следующему шаблону, а в вашем случае это означает, что после обнаружения <!-- строка, которая будет соответствовать .*?, будет следующей тот, который соответствует -->, не следует <br>, даже если является закрывающим комментарием комментария следующего комментария.

Что вам нужно сделать, так это убедиться, что .*? не соответствует -->. Либо использовать (?:(?!-->).)*tempered greedy token, или развернутую версию этого:

'~<!--[^-]*(?:-(?!->)[^-]*)*-->(?!<br>)~s' 

увидеть regex demo

[^-]*(?:-(?!->)[^-]*)* шаблон соответствует любым 0+, кроме - ([^-]*), а затем символы 0+ последовательности - не последовало с -> (см. -(?!->)), а затем символы 0+, кроме -.

(?:(?!-->).)* закаленного жадный маркер соответствует любому символу (.), который не начать --> последовательности ((?!-->)), ноль или более раз (*).

+0

Не могу сказать, что я все понимаю, но, похоже, он работает отлично, чем вы. – suncat100

+0

Дело в том, что '. *?' Соответствует любому символу. Это проблема. Умеренный жадный токен соответствует тексту, который не является исходной точкой шаблона внутри '(?! ...)' отрицательного взгляда. Нам нужно ограничить это '. *?', А умеренный жадный токен - это для этого сценария. Для разворачивания описания принципа цикла см. Http://www.softec.lu/site/RegularExpressions/UnrollingTheLoop. –

Смежные вопросы