@SergeTkach
OpenCart Forever

Почему 1 из этих регулярных выражений приводит к ошибке но только в отдельно взятом случае?

// Исходная строка (вернее, часть строки, в которой наблюдается баг)
$string = 'Речовина, що сприяє охолодженню, називається хладогентом';

// Привело к багу: первая буква Р превратилась в кракозябру
$string = preg_replace( '|\s+|', ' ', $string);

// Работает нормально
$string = preg_replace( '|\s{2,}|', ' ', $string);

Думал, что буквы были в разных кодировках, но mb_detect_encoding показал обратное. И 'Р', и остальная часть строки в кодировке utf-8. Никаких репортов нет. По сути, если не попытаться вывести $string, то и не узнает, что что-то пошло не так.
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
lyberteam
@lyberteam
In PHP we trust
Нет. Необходимо использовать mb_ereg_match.
В новых версиях PHP появился целый ряд функций под общим знаменем MultiByte String.
Данные функции являются аналогами функций по работе с переменными типа string, в кодировке с более чем одним байтом. Таковыми являются как кодировка китайского языка, так и русского и других. Это связано с тем, что одного байта не хватает для хранения огромного количества символов разных языков.
Старайтесь использовать исключительно mb_string функции, если вы не уверены, что переменные будут содержать данные в 1-байтовой кодировке.
Ссылка на официальную документацию
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Добавьте модификатор u (PCRE_UTF8)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы