preg_match и (не английские) латинские символы? - PullRequest
5 голосов
/ 24 марта 2011

У меня есть форма 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).

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

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

1 Ответ

8 голосов
/ 25 марта 2011

Итак, проблема как предполагается. Вы не используете модификатор /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. Результат int(1). Очевидно, что PCRE интерпретирует Latin-1 ø как соответствующий \p{L} в режиме, отличном от /u. (Большинство однобайтовых \ xA0- \ xFF являются буквенными символами в Latin-1, а 8-битная кодовая точка такая же, как в Unicode, так что это на самом деле нормально.)

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

...