PHP preg_replace保持匹配不起作用

时间:2013-07-07 09:44:19

标签: php regex

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

1 个答案:

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

我更喜欢后者。