首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >词汇表替换的正则表达式

词汇表替换的正则表达式
EN

Stack Overflow用户
提问于 2012-04-01 14:01:59
回答 2查看 256关注 0票数 0

我正在编写词汇表模块-它必须找到文本中的已知单词,并将其替换为链接。如果是链接(<a href="...">word</a>)或属性(<span class="word">...</span>),则不能替换word。

我已经写了代码:

代码语言:javascript
复制
$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"><a href="s2">DVB-S2</a></a><a href="dd">DVB-S2</a>

我怎么才能修复它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-01 19:16:53

这就是我得到的,我希望它能工作

代码语言:javascript
复制
   echo preg_replace("@((?!<a\s*[^<>]*>.*?))($word)((?!</a>.))@i",'$1<a href="">$2</a>$3',$html) . chr(10);

它将输出以下内容

代码语言:javascript
复制
<div><a href="">DVB-S2</a>. DVB-S. <a href="">DVB-S2</a>DVB-S <sss <a href="">DVB-S2</a> /> <a href="">DVB-S2</a> <a href="dd">DVB-S2</a> <a href="">DVB-S2</a> Hot bird 6/Hot Bird 8/Hot bird 9, 13.0</div>
票数 0
EN

Stack Overflow用户

发布于 2012-04-01 14:49:36

您需要将其分解为三个规则:

  1. Word的两侧由非单词字符分隔,或者BOSL/EOSL.
  2. Word不在<与其匹配>之间。
  3. Word不在和之间。

对于规则(1),我们需要一个正面的前视和后视:

代码语言:javascript
复制
(?<=^|\W)word(?=\W|$)

\W捕获非单词字符,因此除了字母、数字和下划线之外的任何字符。这与您的版本不完全相同,但您可以根据需要进行调整。\b也可能是一个很好的选择,在这种情况下,您不需要插入符号和美元符号。

现在,为规则(2)添加一个负向后视:

代码语言:javascript
复制
(?<!<[^>]*)(?<=^|\W)(DVB-S2)(?=\W|$)

当单词前面是<和任何非>字符时,即当它位于任何HTML标记中间时,这将防止匹配。

现在,为规则(3)添加一个负先行:

代码语言:javascript
复制
(?<!<[^>]*)(?<=^|\W)(DVB-S2)(?=\W|$)(?!</a>)

当单词后面紧跟一个</a>时,这会阻止匹配。这不是一个完美的解决方案,因为单词可能不是链接文本的唯一部分,但它可能足够接近您的情况,并且它通过了您的测试用例。可能有一种方法可以在单个表达式中比这更精确,但目前还没有想到任何东西。

以上所有代码都是用.NET方言正则表达式编写的,我假设PHP足够相似,可以让它为您工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9962283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档