php preg_replace с использованием массивов — первая или последняя буква с акцентированным символом не работает

В этом примере у меня есть слово así, оканчивающееся символом i с ударением.

 $str = "A string containing the word así which should be changed to color purple";

$prac[] = "/\basí\b/i";
$prac2[] = "<span class='readword'  style='color:purple'>\$0 </span>";

$str= preg_replace($prac,$prac2,$str);

echo $str;

Это не меняет. Но если у меня есть слово, которое не заканчивается или не начинается с ударения, оно меняется. Например:

 $str = "A string containing another word which should be changed to color
purple";
$prac[] = "/\banother word\b/i";
$prac2[] = "<span class='readword'  style='color:purple'>\$0 </span>";

$str= preg_replace($prac,$prac2,$str);

echo $str;
?>

Если акцент находится в середине слова, он всегда работает. Также я проверил сам массив и сам preg_replace со словом. Похоже, что нет проблемы со словом ни с массивом, ни с preg_replace. Это только когда я использую массив в качестве параметра в preg_replace.

Пожалуйста, помогите, не могу найти информацию об этом нигде.

Спасибо

3

Решение

Используйте флаг Unicode:

$str = "A string containing the word así which should be changed to color purple";
$prac[] = "/\basí\b/iu";
#             here __^
$prac2[] = "<span class='readword'  style='color:purple'>\$0 </span>";
$str= preg_replace($prac,$prac2,$str);
echo $str;

Результат для данного примера:

A string containing the word <span class='readword'  style='color:purple'>así </span> which should be changed to color purple
2

Другие решения

Видимо, акцентированный символ рассматривается PHP как граница слова и 3 условия для соответствия границе слова \b являются:

  • Перед первым символом в строке, если первый символ является символом слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

Источник: https://www.regular-expressions.info/wordboundaries.html

Поэтому, когда вы используете /\basí\b/i соответствовать así внутри строки это не вызвало бы ни одно из 3 приведенных условий, первое и второе очевидны, потому что así находится в середине строки, а третий говорит, что соответствует \b в строке нам нужно два символа, где один является символом слова, а другой нет, здесь мы имеем í и пространство которые оба не являются символами слова.

В конце концов, не уверен, что мое понимание тоже верно.

Для решения вы можете заменить свой reg exp на /\basí(\b|\s+)/i

Проверьте также Проблема границы слова регулярного выражения, когда угловые скобки примыкают к границе

А также http://php.net/manual/en/function.preg-replace.php#89471

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector