Безопасны ли многобайтовые функции PHP preg?


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

Author: Spoonface, 2009-11-19

5 answers

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

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

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

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

 25
Author: outis, 2013-10-02 16:06:21

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" рассматривались как одна буква.

 26
Author: user187291, 2011-10-06 23:14:46

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

 1
Author: Gumbo, 2017-05-23 12:10:02

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

 1
Author: Ben S, 2009-11-19 21:03:47

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

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

 1
Author: Spoonface, 2009-11-19 22:21:50