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
Проверьте также вопрос границы слова регулярного выражения, когда угловые скобки примыкают к границе