Регулярное выражение , полностью совместимое с RFC 822, неэффективно и неясно из-за его длины. К счастью, RFC 822 был заменен дважды, и текущая спецификация для адресов электронной почты RFC 5322 . RFC 5322 приводит к регулярному выражению, которое можно понять, если изучить его в течение нескольких минут, и достаточно эффективно для фактического использования.
Одно регулярное выражение, совместимое с RFC 5322, можно найти в верхней части страницы по адресу http://emailregex.com/, но использует шаблон IP-адреса, распространяющийся по Интернету, с ошибкой, допускающей 00
для любого неподписанного байта десятичные значения в адресе, разделенном точками, что недопустимо. Остальная часть, похоже, соответствует грамматике RFC 5322 и проходит несколько тестов, используя grep -Po
, включая доменные имена, IP-адреса, неверные и учетные записи с кавычками и без них.
Исправляя ошибку 00
в шаблоне IP, мы получаем работающее и довольно быстрое регулярное выражение. (Для получения актуального кода очистите отрендеренную версию, а не уценку.)
(: [а-z0-9 # $% & '* + / = ^ _ `{|} ~ - + (?.!: \ [А-z0-9 # $% &!]? * + / = ^ _ `{|} ~ -] +) * |" (:? [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ X5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) * ") @ (: (: [а-z0-9] (: [а-z0-9 -] * [?? ? а-z0-9]) \) + [а-z0-9] (:.?? [а-z0-9 -] * [а-z0-9]) | \ [(:( :( 2 (5 [0-5] | [0-4] [0-9]) | 1 [0-9] [0-9] |?. [1-9] [0-9])) \) { ? 3} (:( 2 (5 [0-5] | [0-4] [0-9]) | 1 [0-9] [0-9] |? [1-9] [0-9] ) | [а-z0-9 -] * [а-z0-9]: (?: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ X5a \ x53- \ x7f] | \ \ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \])
Вот диаграмма из конечного автомата для приведенного выше регулярного выражения, которое более понятно, чем само регулярное выражение
Более сложные шаблоны в Perl и PCRE (библиотека регулярных выражений, используемая, например, в PHP) могут правильно анализировать RFC 5322 без помехи . Python и C # тоже могут это делать, но они используют синтаксис, отличный от первых двух. Однако если вы вынуждены использовать один из многих менее мощных языков сопоставления с образцом, то лучше всего использовать настоящий анализатор.
Также важно понимать, что проверка его в соответствии с RFC абсолютно ничего не говорит вам о том, действительно ли этот адрес существует в предоставленном домене или является ли лицо, вводящее адрес, его истинным владельцем. Люди постоянно подписывают других на списки рассылки. Исправление, которое требует более причудливого вида проверки, который включает отправку на этот адрес сообщения, содержащего токен подтверждения, который должен быть введен на той же веб-странице, что и адрес.
Подтверждающие токены - единственный способ узнать, что вы получили адрес человека, который его вводит. Вот почему большинство списков рассылки теперь используют этот механизм для подтверждения регистрации. В конце концов, любой может отложить president@whitehouse.gov
, и это даже будет считаться законным, но вряд ли это будет человек на другом конце.
Для PHP вы должны , а не использовать шаблон, указанный в Проверка адреса электронной почты с PHP, правильный путь , из которого я цитирую:
Существует некоторая опасность того, что обычное использование и широко распространенное неаккуратное кодирование установят фактический стандарт для адресов электронной почты, который является более ограничительным, чем зарегистрированный формальный стандарт.
Это не лучше, чем все другие не-RFC шаблоны. Он даже не достаточно умен, чтобы справиться даже с RFC 822 , не говоря уже о RFC 5322. Этот , однако, есть.
Если вы хотите стать модным и педантичным, внедрите полный двигатель состояния . Регулярное выражение может действовать только как элементарный фильтр. Проблема с регулярными выражениями заключается в том, что говорить кому-то, что их совершенно действительный адрес электронной почты недействителен (ложный положительный результат), потому что ваше регулярное выражение не может его обработать, просто грубо и невежливо с точки зрения пользователя. Механизм состояний для этой цели может проверять и даже корректировать адреса электронной почты, которые в противном случае считались бы недействительными, поскольку он разбирает адрес электронной почты в соответствии с каждым RFC. Это позволяет получить более приятное впечатление, например
Указанный адрес электронной почты myemail @ address, com недействителен. Вы имели в виду mymymail@address.com?
См. Также Проверка адресов электронной почты , включая комментарии. Или Сравнение адреса электронной почты, проверка регулярных выражений .
Демо Debuggex