Я использую следующую функцию для удаления пробелов из строк:
$str = preg_replace('/\s+/', '', $str);
Я ввожу эту строку французских символов: ù û ü ÿ à â æ ç é è ê ë ï î ô
Символ à
не распознается; это выглядит так: ùûüÿ âæçéèêëïîô
Любая идея почему? Я попытался преобразовать str в UTF-8 перед раздачей, но безрезультатно.
Обновление: я нашел следующее сообщение (странная проблема с preg_replace и китайским символом), где добавление u
в конец регулярного выражения исправляет проблему следующим образом:
$str = preg_replace('/\s+/u', '', $str);
Кажется, это исправить, но может ли кто-нибудь объяснить, почему это происходит вместе с официальным решением, объясняющим, что u
делаете в этом регулярном выражении?
По умолчанию механизм регулярных выражений PHP рассматривает вашу строку как пример байтов (т.е. Как костюм одного байтового символа).
Когда вы используете модификатор u, двигатель regex меняет две вещи:
\s
, \w
, \d
...) изменяется на включение символов Unicode, а не только символов ascii.Обратите внимание, что эти два изменения могут быть явно написаны так же, как и в начале шаблона, вместо использования модификатора u:
(*UTF8)(*UCP)yourpattern
Вы можете найти полную документацию PCRE регулярных выражений, используемых PHP здесь.
PCRE_UTF8
и PCRE_UCP
, посмотрите мой ответ здесь .
u
является модификатором Unicode, php.net/manual/en/reference.pcre.pattern.modifiers.php . Это работает без этого, хотя ... или, по крайней мере, работает здесь и наeval
..