Безопасны ли многобайтовые функции PHP preg_functions?
-
21-09-2019 - |
Вопрос
В PHP нет многобайтовых функций preg, означает ли это, что все функции preg_functions по умолчанию безопасны для МБ?В документации PHP не нашел упоминаний.
Решение
PCRE может поддерживать UTF-8 и другие кодировки Unicode, но это необходимо указать во время компиляции.Из Справочная страница для PCRE 8.0:
Текущая реализация PCRE примерно соответствует Perl 5.10, включая поддержку строк в кодировке UTF-8 и свойств общей категории Unicode.Однако поддержка UTF-8 и Unicode должна быть явно включена;это не значение по умолчанию.Таблицы Юникода соответствуют версии Юникода 5.1.
PHP в настоящее время использует ПКРЕ 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
Некоторые из моих более сложных функций предварительной подготовки:
(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);
Эти изменения выглядят хорошо?