Из JLS
Оператор if-then может завершиться нормально, если хотя бы одно из следующего верно:
> оператор if-then доступен, а выражение условия не является постоянным выражением, значение которого истинно.
> Оператор then может завершиться нормально.
blockquote>Итак
if(false)
разрешено.Эта способность «условно компилировать» оказывает значительное влияние на бинарную совместимость. Если набор классов, использующих такую переменную «флаг», скомпилирован, а условный код опущен, позднее не будет достаточно распространения только новой версии класса или интерфейса, который содержит определение флага. Следовательно, изменение значения флага не является бинарным, совместимым с ранее существовавшими двоичными файлами. (Есть и другие причины такой несовместимости, такие как использование констант в ярлыках case в операторах switch;)
blockquote>
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 .
Нет, это не так. Смотрите вопрос preg_match и UTF-8 в PHP , например.
Нет, вам необходимо использовать многобайтовые строковые функции , например mb_ereg
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:
(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);
Эти изменения выглядят нормально?