Безопасны ли многобайтовые PHP preg_functions?

В PHP нет многобайтовых функций preg, так значит ли это, что preg_functions по умолчанию полностью безопасны? Не удалось найти упоминания в документации php.

5 ответов

Решение

PCRE может поддерживать UTF-8 и другие кодировки Unicode, но это должно быть указано во время компиляции. Со страницы руководства для PCRE 8.0:

Текущая реализация PCRE примерно соответствует Perl 5.10, включая поддержку строк в кодировке UTF-8 и общих свойств категории Unicode. Однако поддержка UTF-8 и Unicode должна быть явно включена; это не по умолчанию. Таблицы Unicode соответствуют выпуску Unicode 5.1.

PHP в настоящее время использует PCRE 7.9; ваша система может иметь более старую версию.

Взглянув на библиотеку PCRE, которая поставляется с PHP 5.2, выяснилось, что она настроена на поддержку свойств Unicode и UTF-8. То же самое для ветви 5.3.

pcre поддерживает utf8 из коробки, см. документацию для модификатора 'u'.

Иллюстрация (\xC3\xA4 - это кодировка utf8 для немецкой буквы "ä")

  echo preg_replace('~\w~', '@', "a\xC3\xA4b");

это повторяет "@@¤@", потому что "\xC3" и "\xA4" рассматривались как отдельные символы

  echo preg_replace('~\w~u', '@', "a\xC3\xA4b");

(обратите внимание на 'u') печатает "@@@", потому что "\xC3\xA4" обрабатывается как одна буква.

Нет, они не. Смотрите вопрос preg_match и UTF-8 в PHP, например.

Нет, вам нужно использовать многобайтовые строковые функции, такие как mb_ereg

Некоторые из моих более сложных функций preg:

(1a) подтвердить имя пользователя как буквенно-цифровой + подчеркивание:

preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/',$username) 

(1b) возможная альтернатива UTF:

preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username) 

(2a) подтвердить адрес электронной почты:

preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix",$email))

(2b) возможная альтернатива UTF:

preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))

(3а) нормализовать переводы строки:

preg_replace("/(\n){2,}/","\n\n",$str);

(3b) возможная альтернатива UTF:

preg_replace("/(\n){2,}/u","\n\n",$str);

Эти изменения выглядят хорошо?

Другие вопросы по тегам