Глюк регулярных выражений в PHP при работе с UTF-8
6 декабря 2008, 7:58
Автор: 1234ru
Нашел такую вещь: если указывать модификатор 'u' (PCRE_UTF8), который предписывает интерпретировать шаблон как строку в utf-8 (см. также http://ru2.php.net/manual/ru/reference.pcre.pattern.modifiers.php), для русских букв работает регистронезависимое сопоставление, но в то же время русские буквы не считаются буквами!
Особенно странное заключается в том, что без модификатора буква распознаётся (хотя регистронезависимое сопоставление, конечно же, не работает, что, впрочем, не странно):
Неожиданным оказалось, что, если сохранить скрипт, например, в кодировке cp-1251, то сопоставление букв разного регистра может проходить успешно:
Проверялось всё это на PHP 5.2.4 под Windows.
Немало удивил также результат проверки на PHP 5.1.6 под Linux: отсутсвие совпадения для всех шести описанных случаев, т.е. модификатор PCRE_UTF8 не работает вообще.
Что бы с этим сделать, как думаете?
<?php
# скрипт в UTF-8
echo preg_match('/г/ui', 'Г'); // выведет 1 - понимает, что 'г' и 'Г' - одна и та же буква
echo preg_match('/\w/u', 'Г'); // выведет 0 - не понимает, что 'Г' - буква!
?>
# скрипт в UTF-8
echo preg_match('/г/ui', 'Г'); // выведет 1 - понимает, что 'г' и 'Г' - одна и та же буква
echo preg_match('/\w/u', 'Г'); // выведет 0 - не понимает, что 'Г' - буква!
?>
Особенно странное заключается в том, что без модификатора буква распознаётся (хотя регистронезависимое сопоставление, конечно же, не работает, что, впрочем, не странно):
<?php
echo preg_match('/г/i', 'Г'); // выведет 0, что неудивительно, т.к. не используется модификатор
echo preg_match('/\w/', 'Г'); // выведет 1
?>
echo preg_match('/г/i', 'Г'); // выведет 0, что неудивительно, т.к. не используется модификатор
echo preg_match('/\w/', 'Г'); // выведет 1
?>
Неожиданным оказалось, что, если сохранить скрипт, например, в кодировке cp-1251, то сопоставление букв разного регистра может проходить успешно:
<?php
# скрипт в CP-1251
echo preg_match('/г/i', 'Г'); // выведет 1
echo preg_match('/\w/', 'Г'); // также выведет 1
?>
# скрипт в CP-1251
echo preg_match('/г/i', 'Г'); // выведет 1
echo preg_match('/\w/', 'Г'); // также выведет 1
?>
Проверялось всё это на PHP 5.2.4 под Windows.
Немало удивил также результат проверки на PHP 5.1.6 под Linux: отсутсвие совпадения для всех шести описанных случаев, т.е. модификатор PCRE_UTF8 не работает вообще.
Что бы с этим сделать, как думаете?