У меня есть форма 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 с входными кодировками.