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

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

PCRE может поддерживать кодировки UTF-8 и другие кодировки Unicode, но их нужно указывать во время компиляции. На странице man для 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\-]+\.)+[az]{2,6}$/ix",$email)) 

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

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

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

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

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

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

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