Пишу про разработку вообще и в частности про: JavaScript, HTML5, CSS3, AngularJS, ReactJS, Agile.

Давайте отпимизуруем проверку email адреса

Давайте поговорим об одной из самых избитых тем web разрваботки – валидация email адреса. Для начала обратимся к истокам. В связи с этим вопрос – Задавались ли вы вопросом какие email адреса считаются валидными? Наверное, не все погружались в изучение этого вопроса достаточно глубоко, а просто использовали найденное регулярное выражение для проверки.

Вот такое например: \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b

Вполне себе адекватное решение, уверен, что вы чем-то подобным уже пользовались. Однако, у меня есть ряд претензий к нему. Одна из явных: что делать с кириллическими доменами? А также море неявных навроде, почему вот эти email адреса вдруг стали невалидными:

Странные адреса, верно? Однако, спецификация email адресов идет еще дальше и позволяет создавать еще более экстравагантные варианты:

“very.(),:;<>[]\”.VERY.\”very@\\ \”very\”.unusual”@strange.example.com

Внимательный читатель, наверняка заметит, что это крайне редкий случай и пользователи врят ли будут использовать столь странные адреса. И он будет прав, однако, это не означает, что мы можем использовать некачественные проверки. Проверка должна отвечать задачам, а с задачей провалидировать email адрес выражение \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b явно не справляется.

Скажу даже больше – независимо от того сколь сложную проверку мы закатим (а есть регулярные выражения, которые на самом деле проверяют всю спецификацию), мы не сможем достоверно провалидировать адрес. Последнюю точку поставит, только отсылка письма по этому адресу и ничто другое.

Так может черт с ней с валидацией? Да, вполне возможно, что это более правильный подход. Однако, совсем без проверок оставлять поле не стоит – что же нам тогда тестировать? Можно протестировать распространенные ошибки и опечатки. Поскольку достоверно мы все равно не знаем валидна почта или нет, так давайте хотя бы поможем пользователю не ошибиться.

Например, вот так

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

Для экспериментов с регулярным выражением можно заглянуть вот сюда: https://regex101.com/r/sT0mQ1/1

Ссылки по теме:
http://www.regular-expressions.info/email.html
https://en.wikipedia.org/wiki/Email_address#Syntax
https://davidcel.is/posts/stop-validating-email-addresses-with-regex/

Поделиться:
comments powered by Disqus