php正则表达式匹配html标签之外

yas*_*sar 8 php regex pcre preg-replace

我正在html页面上创建一个preg_replace.我的模式旨在为html中的某些单词添加周围标记.但是,有时我的正则表达式会修改html标记.例如,当我尝试替换此文本时:

<a href="example.com" alt="yasar home page">yasar</a>
Run Code Online (Sandbox Code Playgroud)

这样yasar读取<span class="selected-word">yasar</span>,我的正则表达式也替换了锚标记的alt属性中的yasar.preg_replace()我正在使用的电流看起来像这样:

preg_replace("/(asf|gfd|oyws)/", '<span class=something>${1}</span>',$target);
Run Code Online (Sandbox Code Playgroud)

如何制作正则表达式,使其与html标签内的任何内容都不匹配?

mar*_*rio 20

你可以使用断言,因为你只需要确保搜索到的单词出现在一个>之后或之前<.后一个测试更容易实现,因为前瞻断言可以是可变长度:

/(asf|foo|barr)(?=[^>]*(<|$))/
Run Code Online (Sandbox Code Playgroud)

另请参阅http://www.regular-expressions.info/lookaround.html以获得该断言语法的详细说明.


zx8*_*x81 8

Yasar,恢复了这个问题,因为它有另一个没有提到的解决方案.

此解决方案不会仅检查下一个标记字符是否为开始标记,而是跳过所有标记<full tags>.

有关使用正则表达式解析html的所有免责声明,这里是正则表达式:

<[^>]*>(*SKIP)(*F)|word1|word2|word3
Run Code Online (Sandbox Code Playgroud)

这是一个演示.在代码中,它看起来像这样:

$target = "word1 <a skip this word2 >word2 again</a> word3";
$regex = "~<[^>]*>(*SKIP)(*F)|word1|word2|word3~";
$repl= '<span class="">\0</span>';
$new=preg_replace($regex,$repl,$target);
echo htmlentities($new);
Run Code Online (Sandbox Code Playgroud)

这是此代码的在线演示.

参考

  1. 如何匹配模式除了情况s1,s2,s3
  2. 除非......如何匹配模式