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