PHP. Кириллица в регулярных выражениях

Author Автор: Роман Чернышов    Опубликовано: 13 ноября 2010

регулярные выраженияСтолкнулся я с проблемой, а именно сайт не в какую не хотел поддерживать русские пароли. При регистрации пользователь в качестве пароля мог использовать только цифры и латинские буквы. Но для рунета также актуальна поддержка паролей с использованием кириллицы. Преимущества в том, что такой пароль пользователь легче запоминает, а также более высокая безопасность, на тот случай если его попытаются подобрать. Например китайские хакеры)).

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

Перед регулярным выражением в скрипте следует указать локаль, делается это написанием следующей команды (если используется кодировка UTF-8, если CP1251 то пишем её):

setlocale(LC_ALL, "ru_RU.UTF-8");

далее само регулярное выражение с ключем \u, чтобы обработчик знал, что в вырожении используются национальные символы.

preg_match('[^A-Za-z0-9а-яА-Я]u', $text)

Таким образом мы научили регулярные выражения дружить с кириллицей. Если есть какие-то дополнения то пожалуйста пишите.

Category PHP     Tags

4 комментария to “PHP. Кириллица в регулярных выражениях”

  • Алексей 22.03.2012 в 2:58 пп

    Не вырезает согласно шаблону прочие символы, типа знака вопроса и т.д. Если убрать ключ \u, то вырезает, но не дружит с кириллицей…

  • Алексей 22.03.2012 в 3:05 пп

    Разобрался. Ключ не там ставил
    /[^a-zA-Z0-9а-яА-Я ]/u — верно
    /[^a-zA-Z0-9а-яА-Я ]u/ — неверно

  • Ал 14.09.2012 в 11:24 дп

    Была похожая задача с кириллицей, только на проверку русских символов в слове без цифр, то бишь слово должно быть написано ТОЛЬКО русскими буквами.
    Писать через setlocale(LC_ALL, «ru_RU.UTF-8»); порой не вариант — не каждый сервак работает с кириллицей (как и в моем случае тоже). Поэтому решил обойти другим способом через 2 функции. Может кому то понадобится — буду рад

    function translitArray(){

    $arr = array(«А» => «A», «Б» => «B», «В» => «V», «Г» => «G», «Д» => «D»,
    «Е» => «E», «Ё» => «YO», «Ж» => «ZH»,
    «З» => «Z», «И» => «I», «Й» => «J», «К» => «K», «Л» => «L»,
    «М» => «M», «Н» => «N», «О» => «O», «П» => «P», «Р» => «R»,
    «С» => «S», «Т» => «T», «У» => «U», «Ф» => «F», «Х» => «X»,
    «Ц» => «C», «Ч» => «CH», «Ш» => «SH», «Щ» => «SHH», «Ъ» => «‘»,
    «Ы» => «Y», «Ь» => «», «Э» => «E», «Ю» => «YU», «Я» => «YA»,
    «а» => «a», «б» => «b», «в» => «v», «г» => «g», «д» => «d»,
    «е» => «e», «ё» => «yo», «ж» => «zh»,
    «з» => «z», «и» => «i», «й» => «j», «к» => «k», «л» => «l»,
    «м» => «m», «н» => «n», «о» => «o», «п» => «p», «р» => «r»,
    «с» => «s», «т» => «t», «у» => «u», «ф» => «f», «х» => «x»,
    «ц» => «c», «ч» => «ch», «ш» => «sh», «щ» => «shh», «ъ» => «»,
    «ы» => «y», «ь» => «», «э» => «e», «ю» => «yu», «я» => «ya»,);

    return $arr;
    }

    function checkTownName($town_name){// check cyrillic symbols if symbol replacement count == word length without spaces

    $tArr = array_keys(translitArray());
    $town_name = str_replace(» «, «», $town_name);
    $town_length = mb_strlen($town_name);
    str_replace($tArr, «», $town_name, $town_check_length);
    return $town_check_length==$town_length;
    }

    Соль в том, что кол-во замен должно равняться кол-ву символов в слове

  • Геннадий 12.08.2020 в 9:00 дп

    А как через preg_match (исключительно через эту функцию) искать внутри файла кириллические слова?

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

Автор блога
Чернышов Роман
Роман Чернышов
Веб-разработчик, Full Stack
Senior, Architector
PHP, JavaScript, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка