用超链接的单词替换单词,单独留下超链接的文本,

时间:2013-04-03 02:17:54

标签: php regex

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

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

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

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

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

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

我尝试了各种前瞻和后视的组合,没有成功。

2 个答案:

答案 0 :(得分:1)

为了简单起见,您可以检查匹配的字词是否紧跟</a>

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

另请注意\b。这样可以避免匹配pit中的spitting,例如(将其转换为s<a ...>pit</a>ting)。

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

答案 1 :(得分: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
你看到了区别吗?