我有一个字典单词列表,我加载到一个数组中。我从数据库表文本字段中获取一个文本块。
我遍历字典单词,并在每次迭代时,检查文本块是否出现该单词。每当找到匹配项时,我用超链接版本替换块中的那个单词,所以当发布文本块时,我可以用鼠标指针悬停在它上面并弹出一个定义。
使用正则表达式很容易实现:
$text = preg_replace("/($dictionary_word)/i", '<a href="" class="glossary_term">$1</a>', $text, -1, $count);
如果我不止一次运行“词典词链接器”,链接将加倍。
我需要做的是编写正则表达式,检测到到达字典单词时尚未关闭的打开锚标记。这样我就知道这个词已经链接了,所以我跳过它。
我尝试了各种前瞻和后视的组合,没有成功。
答案 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
你看到了区别吗?