Являются PHP preg_functions многобайтовым сейфом?

Из JLS

Оператор if-then может завершиться нормально, если хотя бы одно из следующего верно:

> оператор if-then доступен, а выражение условия не является постоянным выражением, значение которого истинно.

> Оператор then может завершиться нормально.

blockquote>

Итак if(false) разрешено.

Эта способность «условно компилировать» оказывает значительное влияние на бинарную совместимость. Если набор классов, использующих такую ​​переменную «флаг», скомпилирован, а условный код опущен, позднее не будет достаточно распространения только новой версии класса или интерфейса, который содержит определение флага. Следовательно, изменение значения флага не является бинарным, совместимым с ранее существовавшими двоичными файлами. (Есть и другие причины такой несовместимости, такие как использование констант в ярлыках case в операторах switch;)

blockquote>

28
задан Spoonface 19 November 2009 в 20:58
поделиться

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

25
ответ дан 28 November 2019 в 03:06
поделиться

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

1
ответ дан Community 14 October 2019 в 10:48
поделиться

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

1
ответ дан 28 November 2019 в 03:06
поделиться

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

27
ответ дан 28 November 2019 в 03:06
поделиться

Некоторые из моих более сложных функций 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
ответ дан 28 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: