Preg_replace str 如果不是紧跟着 str

Preg_replace str if not immediately followed by str

我已经尝试了 2 个小时,但我似乎无法正确掌握正则表达式。我想替换字符串中的所有 html 注释,但前提是该字符串没有立即被 <br> 标记取代。

我已经很好地完成了以下工作,从字符串中删除所有 html 评论:

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

我正在尝试添加,以便在 <br> 标记后立即成功的评论不会被替换。我在想这样的事情(显然是错误的),但我无法理解它:

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

感谢任何指导。

惰性点模式将匹配尽可能少的字符,直到与后续模式匹配的第一个子字符串,在您的情况下,这意味着一旦找到 <!--,将匹配的字符串.*? 将是下一个匹配 --> 而不是 <br> 即使 它是下一个评论的结束评论定界符。

您需要做的是确保 .*? 不匹配 -->。使用 (?:(?!-->).)* tempered greedy token 或它的展开版本:

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

regex demo

[^-]*(?:-(?!->)[^-]*)* 模式匹配除 - ([^-]*) 之外的任何 0+ 个字符,然后是 - 的 0+ 个序列,后面没有 -> (参见 -(?!->)),然后是 -.

以外的 0+ 个字符

(?:(?!-->).)* tempered greedy token 匹配任何不开始 --> 序列 ((?!-->)) 的字符 (.),零次或多次 (*).