我有以下代码:
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”。
在保留我之前编写的所有规则的同时,我最好的选择是什么?
答案 0 :(得分:4)
包含您要与\b
运算符匹配的全部字词 - 这表示word boundary:
$pattern = "/(\b{$data[0]}\b(?![^><]*?(?:>|<\/a)))/i";
$subject = "<a href=\"{$data[1]}\" class=\"postlink\">$1</a>";
$message = preg_replace($pattern, $subject, $message, 1);