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'
[^-]*(?:-(?!->)[^-]*)*
模式匹配除 -
([^-]*
) 之外的任何 0+ 个字符,然后是 -
的 0+ 个序列,后面没有 ->
(参见 -(?!->)
),然后是 -
.
以外的 0+ 个字符
(?:(?!-->).)*
tempered greedy token 匹配任何不开始 -->
序列 ((?!-->)
) 的字符 (.
),零次或多次 (*
).
我已经尝试了 2 个小时,但我似乎无法正确掌握正则表达式。我想替换字符串中的所有 html 注释,但前提是该字符串没有立即被 <br>
标记取代。
我已经很好地完成了以下工作,从字符串中删除所有 html 评论:
preg_replace('/<!--.*?-->/s', '', $str);
我正在尝试添加,以便在 <br>
标记后立即成功的评论不会被替换。我在想这样的事情(显然是错误的),但我无法理解它:
preg_replace('/<!--.*?-->(?!<br>)/s', '', $str);
感谢任何指导。
惰性点模式将匹配尽可能少的字符,直到与后续模式匹配的第一个子字符串,在您的情况下,这意味着一旦找到 <!--
,将匹配的字符串.*?
将是下一个匹配 -->
而不是 <br>
即使 它是下一个评论的结束评论定界符。
您需要做的是确保 .*?
不匹配 -->
。使用 (?:(?!-->).)*
tempered greedy token 或它的展开版本:
'~<!--[^-]*(?:-(?!->)[^-]*)*-->(?!<br>)~s'
[^-]*(?:-(?!->)[^-]*)*
模式匹配除 -
([^-]*
) 之外的任何 0+ 个字符,然后是 -
的 0+ 个序列,后面没有 ->
(参见 -(?!->)
),然后是 -
.
(?:(?!-->).)*
tempered greedy token 匹配任何不开始 -->
序列 ((?!-->)
) 的字符 (.
),零次或多次 (*
).