1

我正在尝试创建一个简单的函数来搜索字符串中的单词并将其链接。问题是有时这个词的末尾有一个点或逗号,我想保留它。所以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", "#");
4

1 回答 1

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在你的字符串中也替换!)或使用否定的环视断言

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);
}

我更喜欢后者。

于 2013-07-07T09:51:56.557 回答