Регулярные выражения в php: проблемы с русским в utf-8
В очередной раз по заказу правил один плагин для Wordpress. Столкнулся с неприятной вещью: обработкой русских строк в кодировке utf-8. Регулярными выражениями почему-то не захватывались русские символы, хотя английские хавало на ура.
В официальном мануале по preg_match_all почему-то не было ничего написано про заветный модификатор /u, который как раз и дает возможность работать с символами национальных алфавитов, в моем случае русским. Но самая жо засада в другом – функции для работы со строками вроде substr, strlen, strpos работают с utf-8 наикривейшим образом. Причем даже тогда, когда из utf-8 я переводил в windows-1251с помощью iconv …
И вот тут по идее должны были помочь танцы с бубном и перебор всего, что придет в голову – всякие инпут, аутпут кодировки в iconv, потуги разобраться в mbstring – но там вообще мануалы недописаны. (И не факт, что это расширение у заказчика стоит, на моем хостинге я включал его самостоятельно.)
Когда мне это надоело, осталась только одна спасительная ниточка – спросить поисковики. И о чудо – один джедай в далеком 2006 году расписал эту проблему и показал, как ее решить - Регулярные выражения для обработки строк UTF-8 в PHP. Он написал свои аналоги для substr, strlen, strpos, правда в моем случае там все равно был глюк, а вернее неожиданное поведение – utf8_substr(строка,0,0) давало всю строку, я это вроде бы поправил. Но не суть, это уже что-то.
Я уверен, что кто-то вот точно также наступит на те же грабли, поэтому написал этот пост. Ждемс php6, в котором это безобразие обещали исправить.

Один комментарий к «Регулярные выражения в php: проблемы с русским в utf-8»
Самый Денис - 19.02.2009
Вместе с модификатором u используйте ВМЕСТО \w такую конструкцию: \p{L}\p{Nd}
Написать комментарий