Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

preg_match понимает не все русские буквы

#php #регулярные_выражения


Почему может быть, что  

preg_match('/^[а-яА-ЯЁёa-zA-Z0-9_]+$/', $userName)


возвращает true для буквы "ПП","пп","УУ","еe","яя" и false для "тт", "уу","юю" и
других?  

Кодировка UTF-8. Php 5.2.17

Также я заметил, что strlen($userName), например, для "пп" = 4, а для "уу" = 2.

П.С. При этом  

preg_match('/^[_0-9A-Za-zА-Яа-пр-яЁё]+$/', $userName)


работает.
    


Ответы

Ответ 1



В PHP Регулярные выражения не работают с русскими буквами. Для работы с ними нужно использовать модификатор /u u (PCRE_UTF8) Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: шаблон и целевая строка обрабатываются как UTF-8 строки. Модификатор u доступен в PHP 4.1.0 и выше для Unix-платформ, и в PHP 4.2.3 и выше для Windows платформ. Валидность UTF-8 в шаблоне и целевой строке проверяется начиная с PHP 4.3.5. Недопустимая целевая строка приводит к тому, что функции preg_* ничего не находят, а неправильный шаблон приводит к ошибке уровня E_WARNING. Пятый и шестой октеты UTF-8 последовательности рассматриваются недопустимыми с PHP 5.3.4 (согласно PCRE 7.3 2007-08-28); ранее они считались допустимыми. Источник Пример: preg_match( '/^([а-яА-ЯЁёa-zA-Z0-9_]+)$/u', $userName)

Ответ 2



На счет разного результата strlen - для utf-8 следует использовать mb_strlen.

Комментариев нет:

Отправить комментарий