preg_replace ошибка с регулярным выражением с неанглийскими символами, символ не распознан

1

Я использую следующую функцию для удаления пробелов из строк:

$str = preg_replace('/\s+/', '', $str);

Я ввожу эту строку французских символов: ù û ü ÿ à â æ ç é è ê ë ï î ô

Символ à не распознается; это выглядит так: ùûüÿ âæçéèêëïîô

Любая идея почему? Я попытался преобразовать str в UTF-8 перед раздачей, но безрезультатно.


Обновление: я нашел следующее сообщение (странная проблема с preg_replace и китайским символом), где добавление u в конец регулярного выражения исправляет проблему следующим образом:

$str = preg_replace('/\s+/u', '', $str);

Кажется, это исправить, но может ли кто-нибудь объяснить, почему это происходит вместе с официальным решением, объясняющим, что u делаете в этом регулярном выражении?

  • 0
    Ваша страница в UTF8? Работает здесь, eval.in/447334 ... образец строки ваша точная строка?
  • 0
    u является модификатором Unicode, php.net/manual/en/reference.pcre.pattern.modifiers.php . Это работает без этого, хотя ... или, по крайней мере, работает здесь и на eval ..
Показать ещё 1 комментарий
Теги:
special-characters
character-encoding
preg-replace

1 ответ

4
Лучший ответ

По умолчанию механизм регулярных выражений PHP рассматривает вашу строку как пример байтов (т.е. Как костюм одного байтового символа).

Когда вы используете модификатор u, двигатель regex меняет две вещи:

  • Строки рассматриваются как строки utf8 (так что символы кодируются со множеством байтов)
  • значение классов сокращенных символов (например, \s, \w, \d...) изменяется на включение символов Unicode, а не только символов ascii.

Обратите внимание, что эти два изменения могут быть явно написаны так же, как и в начале шаблона, вместо использования модификатора u:

(*UTF8)(*UCP)yourpattern

Вы можете найти полную документацию PCRE регулярных выражений, используемых PHP здесь.

  • 0
    Этот. Если вы хотите пойти глубже и увидеть отрывок из документации PCRE о PCRE_UTF8 и PCRE_UCP , посмотрите мой ответ здесь .
  • 0
    Любая идея, почему код выводит правильно здесь: eval.in/447341 все же, когда я запускаю его на моем компьютере, он выводит неправильно? Я использую PHP на IIS 7.5, PHP 5.6.0, но не уверен, что это имеет значение.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню