Соответствие символов UTF с preg_match в PHP: (* UTF8) Работает в Windows, но не в Linux

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

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 и получил ту же ошибку. Фактически, я видел эту работу только в своей локальной среде разработки. Есть ли способ разрешить специальные символы, которые будут работать для всех операционных систем?

Попробуйте, описав символы с помощью свойств символа Юникода :

 preg_match('/^\p{L}[\p{L} _.-]+$/u', $username) 

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

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

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

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

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

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

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

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

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