PHP正则表达式仅匹配整个单词

4

I have the following code:

function mmh_links($message){
    ini_set('auto_detect_line_endings','1');
    $row = 1;
    if (($handle = fopen(realpath(dirname(__FILE__))."/mmh_replace.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $message = preg_replace("/({$data[0]}(?![^><]*?(?:>|<\/a)))/i","<a href=\"{$data[1]}\" class=\"postlink\">$1</a>",$message,1);
        }
        fclose($handle);
    }

    return $message;    
}

这段代码从CSV文件中查找特定关键字,并用CSV文件中给定的链接将它们包围起来。此外,它确保每个关键字仅替换一次,并确保不替换已在链接内的关键字,并且不区分大小写。到目前为止都很好。

现在我想将搜索限制为“整个单词”,也就是说,我不希望“test”匹配“xxxtestxxx”。

在保留之前所有规则的同时,我最好的选择是什么?


这个答案足够吗?还是您还有其他问题? - Andy
1个回答

4

使用\b运算符包裹您想匹配的整个单词-这表示一个单词边界

$pattern = "/(\b{$data[0]}\b(?![^><]*?(?:>|<\/a)))/i";
$subject = "<a href=\"{$data[1]}\" class=\"postlink\">$1</a>";
$message = preg_replace($pattern, $subject, $message, 1);

当 $data[0] 是包含斜杠的单词时,比如 "test/slash",我遇到了解析错误的问题。 - Nathan H
这是因为 / 是一个正则表达式的分隔符。使用 str_replace() 函数对 $data[0] 进行替换,将斜杠转义(变成 \/)。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接