【发布时间】:2012-04-01 06:01:58
【问题描述】:
我正在编写词汇表模块 - 它必须在文本中找到已知单词并用链接替换它。如果是链接 ancor (<a href="...">word</a>) 或属性 (<span class="word">...</span>),则不能替换 word。
我已经写了代码:
$x = '<div>DVB-S2. DVB-S. DVB-S2DVB-S <sss DVB-S2 /> DVB-S2 <a href="dd">DVB-S2</a> DVB-S2 Hot bird 6/Hot Bird 8/Hot bird 9, 13.0</div>';
$word = 'Hot Bird 8';
$x = preg_replace("'(?<=[\s\>])(" . $word . ")(?=[^\d\w\-])(?!([^<]+)?>)'is", "<a href=\"s2\">$1</a>", $x);
$word = 'DVB-S2';
$x = preg_replace("'(?<=[\s\>])(" . $word . ")(?=[^\d\w\-])(?!([^<]+)?>)'is", "<a href=\"s2\">$1</a>", $x);
echo $x;
但它会将<a href="dd">DVB-S2</a> 替换为<a href="dd"><a href="s2">DVB-S2</a></a>。
我该如何解决?
【问题讨论】:
-
我测试了你的代码,我注意到第一个 preg_replace 没有做任何事情
-
更重要的是第二个正则表达式,以及锚替换问题。
-
如果原来的a标签存在,你要替换它吗?
-
所以表达式必须找到并替换 DVB-S2 的所有实例,除了 标记中已经存在的实例?
-
是的。 标签或标签属性内除外。
标签: php regex preg-replace