У меня есть следующий код:
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. Кроме того, он гарантирует, что он заменяет только каждое ключевое слово только один раз и гарантирует, что он не заменит ключевые слова, которые уже находятся в ссылках, и не зависит от регистра. Все хорошо до сих пор.
Теперь я хочу ограничить поиск «целыми словами», что означает, что я не хочу, чтобы «тест» улавливал «xxxtestxxx».
Какой у меня лучший способ сделать это, сохранив все правила, которые я написал раньше?
Оберните все слова, которые вы хотите сопоставить с оператором \b
– это означает границу слова :
$pattern = "/(\b{$data[0]}\b(?![^><]*?(?:>|<\/a)))/i"; $subject = "<a href=\"{$data[1]}\" class=\"postlink\">$1</a>"; $message = preg_replace($pattern, $subject, $message, 1);