Я пытаюсь выделить слова в тексте с помощью pregreplace. Слова находятся в массиве, который я загружаю в pregreplace. Раньше это работало, но остановилось, возможно, из-за обновления php в прошлом, теперь ничего не возвращает.
// Function highlights $words in $str
function highlight_words($str, $words) {
global $color;
if (is_array($words)) {
foreach($words as $k => $word) {
// $pattern[$k] = "~\b($word)\b~is";
$pattern[$k] = "/$word/";
$replace[$k] = '<span style = "background: '.$color[2].';color:'.$color[4].';">\\1</span>';
}
}
else {
$pattern = "~\b($words)\b~is";
$replace = '<span style = "background: '.$color[2].';color:'.$color[4].';">\\1</span>';
}
return preg_replace($pattern,$replace ,$str);
}
echo highlight_words($text, $words);
значения шаблона:
Array
(
[0] => /$18.5mUSD/
[1] => /$8,000,000.00/
[2] => /(at)/
[3] => /+43 688 649 45702/
...
значения $replace:
Array
(
[0] => <span style = "background: #FF6B02;color:#FFFFFF;">\1</span>
[1] => <span style = "background: #FF6B02;color:#FFFFFF;">\1</span>
[2] => <span style = "background: #FF6B02;color:#FFFFFF;">\1</span>
[3] => <span style = "background: #FF6B02;color:#FFFFFF;">\1</span>
...
preg_replace просто ничего не возвращает. Кажется, проблема с массивом, но синтаксис выглядит нормально. Если я изменю preg_replace, чтобы заменить какой-то простой шаблон регулярного выражения, это сработает, но это не работает с массивом.
Как это можно исправить?
Кроме того, между пробелами и $ или ( нет границы слова. Используйте $pattern = "~(?<!\w)($words)(?!\w)~is" вместо $pattern = "~\b($words)\b~is".






Вам нужно избегать любых символов, которые имеют особое значение
$ + .и т. д. в шаблоне:$pattern[$k] = "/" . preg_quote($word, "/") . "/";