Intereting Posts
Как удалить имя действия из url в cakephp? Ошибка MySQL: «mysql_fetch_assoc () ожидает, что параметр 1 будет ресурсом» PHP-скрипт продолжается после закрытия / остановки страницы jQuery Ajax в разных портах Как я могу получить локальное время пользователя, а не время сервера? PHP MySQL Query не работает, но работает с терминала Как заставить PHP установить код состояния HTTP на 500 автоматически в случае каких-либо ошибок? (включая те, которые не могут обрабатываться пользователем) Глобальные переменные и локальные переменные Разделить ошибки PHP и ошибки приложения Определение процента для случайного числа Должны ли разработчики PHP использовать хранимые процедуры MySQL? Иностранные языки POSTGRES Как поймать идентификатор из sfUser? Как удалить "index.php" в пути codeigniter Предупреждение: mysqli_connect (): (HY000 / 2002): php_network_getaddresses: getaddrinfo не удалось: никакой хост не известен

preg_match и (не английские) латинские символы?

У меня есть форма XHTML, где я прошу людей ввести полное имя. Затем я сопоставляю это с preg_match() используя этот шаблон: /^[\p{L}\s]+$/

На моем локальном сервере под управлением PHP 5.2.13 (PCRE 7.9 2009-04-11) это работает отлично. На веб-хосте под управлением PHP 5.2.10 (PCRE 7.3 2007-08-28) он не совпадает, когда введенная строка содержит датский латинский символ ø ( http://www.ltg.ed.ac.uk/~richard/ utf-8.cgi? input =% F8 и mode = char ).

Это ошибка? Есть ли работа?

Заранее спасибо!

Таким образом, проблема такая, как предполагалось. Вы не используете модификатор /u . Это означает, что PCRE не будет искать символы UTF-8.

В любом случае, вот как это должно быть сделано:

 var_dump(preg_match('/^[\p{L}\s]+$/u', "ø")); 

И работает над всеми моими версиями. В других может быть ошибка, но это вряд ли возможно.

Ваша проблема в том, что это также работает:

 var_dump(preg_match('/^[\p{L}\s]+$/', utf8_decode("ø"))); 

Обратите внимание, что это использует ISO-8859-1 вместо UTF-8 и не /u модификатор /u . Результат – int(1) . Очевидно, что PCRE интерпретирует латинский-1 ø как соответствующий \p{L} когда он находится в режиме не- /u nicode. (Большинство однобайтных \ xA0- \ xFF являются символами букв в латинском-1, а 8-разрядная точка кода такая же, как в Юникоде, так что это нормально.)

Вывод: ваш ввод – это ISO-8859-1. Вот почему это случайно сработало для вас без /u . Измените это и будьте eaxact с входными кодировками.