2

我有一个字典单词列表,我将其加载到数组中。我从数据库表文本字段中获取了一段文本。

我遍历字典单词,并且在每次迭代中,我检查文本块中单词的出现。每当找到匹配项时,我用超链接版本替换块中的那个单词,所以当文本块发布时,我可以用鼠标指针悬停在它上面并弹出一个定义。

使用正则表达式很容易实现:

$text = preg_replace("/($dictionary_word)/i", '<a href="" class="glossary_term">$1</a>', $text, -1, $count); 

如果我不止一次运行“字典单词链接器”,链接将加倍。

我需要做的是代码正则表达式,它检测到到达字典单词时尚未关闭的打开锚标记。这样我就知道这个词已经链接了,所以我跳过它。

我尝试了向前和向后看的各种组合,但没有成功。

4

2 回答 2

1

为简单起见,您只需检查匹配的单词是否没有紧跟</a>

"/\b($dictionary_word)\b(?!<\/a>)/i"

还要注意\b添加。例如,这将避免匹配pitin spitting(这会将其变成s<a ...>pit</a>ting)。

也许您的文档中有其他类型的超链接文本?这将阻止所有超链接的单个单词链接到字典,这是适当的,因为一个单词不能成为两个 URL 的一部分。但是这些都不会检测到<a href="...">a longer stretch of linked text</a>. 如果您需要更聪明的行为,您需要的不仅仅是一种愚蠢的正则表达式替换方法。

于 2013-04-03T14:03:48.680 回答
0
$str = "today is 2013-04-03, tomrrow is 2013-04-04";
$output1 = preg_replace("/(\d{4}-\d{2}-\d{2})/i", "happy day", $str, 1);
$output2 = preg_replace("/(\d{4}-\d{2}-\d{2})/i", "happy day", $str);

只更换一次。

echo $output1;
today is happy day, tomrrow is 2013-04-04

全部替换

echo $output2;
today is happy day, tomrrow is happy day

你看到区别了吗?

于 2013-04-03T05:15:39.087 回答