我正在尝试创建一个简单的函数来搜索字符串中的单词并将其链接。问题是,有时单词的末尾有一个点或逗号,我想保留它。因此text word.
应更改为text <a href="#">word</a>.
而不是text <a href="#">word</a>
这是我迄今为止的功能。我不明白为什么它不起作用:
$string = "words are plenty in the world. another world and another world,comma.";
function findWord ($string, $word, $link) {
$patt = "/(?:^|[^a-zA-Z])(" . preg_quote($word, '/') . ")(?:$|[^a-zA-Z])/i";
return preg_replace($patt, ' <a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string);
}
echo findWord ($string, "world", "#");
答案 0 :(得分:1)
您已使用非捕获组(?:...)
来匹配可能围绕搜索字的字符,但随后使用$3
,就好像他们正在捕获组(...)
一样。
因此,$3
将始终为空。您可以改为使用捕获组:
function findWord ($string, $word, $link) {
$patt = "/(^|[^a-zA-Z])(" . preg_quote($word, '/') . ")($|[^a-zA-Z])/i";
return preg_replace($patt, '$1<a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string);
}
(但请不要忘记在字符串中替换$1
!)或使用negative lookaround assertions:
function findWord ($string, $word, $link) {
$patt = "/(?<![a-zA-Z])(" . preg_quote($word, '/') . ")(?![a-zA-Z])/i";
return preg_replace($patt, '<a href="'.$link.'" class="glossary-item">'.$word.'</a>', $string);
}
我更喜欢后者。