Preg_replace не работает с кириллицей в UTF-8?

PHP 5.4, preg_replace, UTF-8,кириллица. Собственно не одного меня постигла такая неудача (возможно из-за неправильной настройки локали), судя по результатам гугла. Решений этой проблемы предлагалось уйма, вплоть до написания собственного языка программирования и сложнее…. Но я бы не стал писать этот пост, если бы не нашел элементарное решение.
Имеем следующие регулярки

$name1 = preg_replace("#([^-0-9a-zа-яё_!'&$@%\s\*\.]*)#i", '', $name);
$name2 = preg_replace("#([^-0-9A-Za-zа-ЯёЁ_!'&$@%\s\*\.]*)#i", '', $name);
$name3 = preg_replace("#([^-0-9A-Za-zа-яА-ЯёЁ_!'&$@%\s\*\.]*)#u", '', $name);

Все они работают с разной степенью корявости. Кто-то глотает определенные символы, кто-то все сразу. На скрине результаты работы трех регулярок
9
Видно что preg_replace немного туповат и не понимает некоторые символы. Поэтому делаем так:

$name = preg_replace("#([^-A-Za-zйцукенгшщзхъфывапролджэячсмитьбюйЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁ_!'&$@%\s\*\.]*)#i", '', $name);

Явно указываем ему все буквы русского алфавита в двух регистрах и только тогда регулярка заработает.
Нашел еще одно решение недавно

$name = preg_replace("#[^\p{L}0-9\s\!\-\_]#iu", '', $name);

Взято из http://www.pcre.org/current/doc/html/pcre2unicode.html

Обновлено: 06/05/2016 — 17:24

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *