Подтвердить что ты не робот

Являются ли PHP preg_functions многобилетными безопасными?

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

4b9b3361

Ответ 1

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 lib, который поставляется с PHP 5.2, похоже, что он настроен на поддержку свойств Unicode и UTF-8. То же самое для 5.3 branch.

Ответ 2

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" обрабатываются как одна буква.

Ответ 5

Некоторые из моих более сложных функций 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))

(3a) нормализует новые строки:

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

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

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

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