Сопоставление символов UTF с preg_match в PHP: (* UTF8) Работает в Windows, но не в Linux - PullRequest
6 голосов
/ 28 февраля 2010

У меня есть простое регулярное выражение для проверки имени пользователя:

preg_match('/(*UTF8)^[[:alnum:]]([[:alnum:]]|[ _.-])+$/i', $username);

В локальном тестировании (Windows 7 с использованием WAMP) это позволит использовать имена пользователей с использованием символов UTF (например, é или ñ). Однако, когда я перехожу, чтобы проверить это на сервере, где сайт будет фактически размещен, я получаю следующее предупреждение:

Предупреждение: preg_match () [function.preg-match]: ошибка компиляции: (* VERB) не распознается по смещению 5 в /home/sites/vgmusic.com/test/Core/Impl/FormElementValidator.php в строке 12

Я также пробовал это на локальной установке Ubuntu и получаю ту же ошибку. На самом деле, я видел эту работу только в своей локальной среде разработки. Есть ли способ разрешить использование специальных символов, которые будут работать для всех операционных систем?

Ответы [ 3 ]

15 голосов
/ 28 февраля 2010

Попробуйте, описав символы с помощью Свойства символов Unicode :

preg_match('/^\p{L}[\p{L} _.-]+$/u', $username)
2 голосов
/ 25 марта 2011

Я уже пробовал с упомянутым параметром /u. В Windows (PHP 5.2.16) добавление параметра /u отлично работало для захвата строки, содержащей символы Юникода, однако в CentOS 5 и PHP 5.2.16 я все еще не мог захватить строку, содержащую символы Юникода, используя .* ( preg_match в основном не удалось захватить).

После долгого бездействия, возни с настройками 'LOCALE', которые ничего не изменили, я наконец нашел этот сайт .

Я выполнил rpm -Uvh соответствующей версии rpm, перезапустил apache, и вдруг мои регулярные выражения сработали отлично!

Несмотря на то, что у меня изначально была поддержка UTF-8, мои регулярные выражения не захватывали строки Unicode, пока я не установил обновленную версию rpm, в которую также добавлена ​​«Поддержка свойств Unicode». Я думал, что поддержки UTF-8 было бы достаточно, но, видимо, нет.

1 голос
/ 14 декабря 2016

кажется, это старый пост, но так как он всегда является предметом интереса, я опубликую то, что я обнаружил здесь . Это небольшая разница, но делает код более простым. Дело в том, что фигурные скобки необязательны .

Приведенный выше код Гамбо и Скотта можно написать более простым, например, так, если кто-то хочет разрешить только буквы (Unicode & non-Unicode) и пробелы:

preg_match("/^\pL[\pL ]+$/u",$string)

Я также заметил, что preg_match принимает еще более простой код, как показано ниже:

preg_match("/^[\pL ]+$/u",$string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...