• Авторизация


Валидация ФИО 07-05-2008 18:38 к комментариям - к полной версии - понравилось!


Настроение сейчас - нормальное

Сегодня по долгу службы, пришлось писать регулярное выражение для валидации введенных пользователем Фамилии Имени Отчества. Увы, но великий и мудрый Гугль с Яндексом в лице моей любимой поисковой системы Nigma (http://www.nigma.ru), не смогли связать и двух слов по этой теме. Пришлось думать самому.

Конечно, проверка соответствия английского имени пользователя вполне тривиальная задача:


/^[A-Z][a-z]{2,}\040[A-Z][a-z]{2,}$/



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

Что ж, остается учесть, что в русском и украинском языках есть еще и отчество, в итоге получим такое выражение для русского:


/^
([А-Я][а-я]{2,}
\040
[А-Я][а-я]{2,}
\040
[А-Я][а-я]{2,}
$/


То есть, то же самое что для английского варианта, но с еще одним словом и русскими буквами.

Дальше - проще.

В украинском варианте стоит учесть наличие таких символов как І і Ї ї Є є Ґ ґ откуда получаем regex такого вида:


/^
[\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,}
\040
[\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,}
\040
[\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,}
$/


Чудненько! А теперь осталось учесть, что некоторые люди берут себе двойные фамилии, то есть к своей собственной добавляют еще и фамилию мужа, жены или для женщин - сохраняют девичью фамилию.

Такие фамилии пишутся через дефис, что мы и отразим в результирующем выражении, получив на выходе моего мозга следующее:


/^
([\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,}
|
[\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,}
\-
[\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,})
\040
[\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,}
\040
[\xa5\xaf\xb2\xaaА-Я][\xb4\xb3\xbf\xba\x27а-я]{2,}
$/


Соглашусь, что для вариантов с Сен-Жюст, Мак-Магон можно и в выражении для английского языка предусмотреть использование дефиса, если они там конечно бывают.

Вот в общем-то и всё. Теперь в инете будет хоть какой-то образец подобной валидации.

Полученное регулярное выражение предназначено для проверки соответствия строки введенной пользователем формату Фамилии Имени Отчества для русского и украинского языков одновременно. Если же понадобиться анализ только русских имен, то конечно следует исключить лишние символы из этого регекса.

Теперь некий гипотетический В'яїсненко-Марусяк Мар'ян Іґнатович будет валидироваться как корректная строка ФИО!

Вот так-то...


Кстати, популярно о регулярных выражениях советую почитать здесь:

http://www.pcre.ru/

а в контексте модуля mod_rewrite тут:

http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html

[480x486]

вверх^ к полной версии понравилось! в evernote
Комментарии (6):
19-11-2009-18:40 удалить
А что делать с такой Фамилией Петро-Абу-Малахович ?
Smile_ArT 19-11-2009-18:42 удалить
Исходное сообщение Аноним А что делать с такой Фамилией Петро-Абу-Малахович ?
А бывают и такие извраты? Ну, это просто - добавить еще один вариант с дефисом.
20-11-2009-15:01 удалить
Ответ на комментарий Smile_ArT #
^[А-Я][а-я]{1,}(([-])([А-Я]|[а-я]){1}[а-я]{1,})*$ Вот сам задал вопрос сам и ответил. Теперь фамилия типа Абу Райхан аль-Беруни пройдет валидацию. По долгу службы делаю валидацию полей для ЗАГСа а там фамилии могут быть любые с тире и пробелом и т.д. Если есть ошибки напишите !!! ждуууу сам первый раз валидацией занимаюсь )))
Smile_ArT 20-11-2009-15:08 удалить
Ответ на комментарий # Да я ответил вроде бы, просто можно было скопировать строку в том выражении что я привел в статье, впрочем придумать свое это еще лучше! А что касается ошибок и тестирования выражения, то я бы рекомендовал вот такой сервис в котором все это дело можно потестировать на самых различных строках: http://gskinner.com/RegExr/ крайне рекомендую. Там все просто.
20-11-2009-15:28 удалить
Ответ на комментарий Smile_ArT #
Увы не долго я радовался, увидел вот такую фамилию "У Дау Ма", а может это и имя и отчество заодно, сложно сказать. Пришлось переделать теперь вот так ^[А-Я]+[а-я]*+(([-])+([А-Я]|[а-я]){1}+[а-я]*)*$
Smile_ArT 20-11-2009-15:29 удалить
мда... Бывает, оказывается, и такое...


Комментарии (6): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Валидация ФИО | Smile_ArT - Дневник Smile_@rT | Лента друзей Smile_ArT / Полная версия Добавить в друзья Страницы: раньше»