У меня есть простое регулярное выражение для проверки имени пользователя:
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)