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.

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

Спасибо

2 ответа

Решение

Используйте флаг 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

Видимо, акцентированный символ рассматривается 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

Другие вопросы по тегам