zorba_buddha
@zorba_buddha
IT

Регулярное выражение работает некорректно

С одной стороны всё до жути банально — надо позволить пользователю ввести имя и фамилию в разные поля, условия — латиница или кириллица, точка, пробел.
a-z не пропускает всю кирилицу и параметр i тоже не работает с ней, мало того — а-я не являет собой весь диапазон кириллицы.

Сделал банально: /^([a-zA-Z \.\-]{1,20}|[абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ \.\-]{1,20})$/
Всё круто, но бывают ситуации когда и эта сволочь не берёт, что надо, а конкретно фамилию «Финикийский» — причём по частям съедает, полностью — нет!

Единственное, что делаю перед проверкой — обрабатываю полученные данные функцией trim(), но ситуация не меняется даже если её убрать.

Выручайте, братцы и сестры!
  • Вопрос задан
  • 2709 просмотров
Решения вопроса 1
dsn13
@dsn13
На PHP в UTF-8 необходимо использовать модификатор u

Выдержка из мануала:
u (PCRE_UTF8)
This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32. UTF-8 validity of the pattern is checked since PHP 4.3.5.

Выражение примет вид /^([a-z \.\-]{1,20}|[а-яё \.\-]{1,20})$/ui
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@icoder
Гранаты, у Вас не той системы. В .NET паттерн работает на «Финикийский», только что проверил. Скорее всего баг в коде, где-то какой-то левый символ попадает.
Ответ написан
@icoder
Да и ^([a-zA-Z \.\-]{1,20}|[а-яА-Я \.\-]{1,20})$ замечательно работает.
Ответ написан
@Hint
Точку в перечислениях не надо экранировать, да и дефис в конце тоже (но только если он в конце).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы