Существует ли реализация Java проверки входящей электронной почты в формате HTML? - PullRequest
8 голосов
/ 09 февраля 2011

Я хотел бы использовать новый элемент <input type="email" />.Я хотел бы иметь Java-код, который реализует ту же проверку на сервере, что и в браузере.

Спецификация HTML5 определяет адреса электронной почты в ABNF как:

1*( atext / "." ) "@" ldh-str *( "." ldh-str )

, где :

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9

и :

atext           =   ALPHA / DIGIT /    ; Printable US-ASCII
                       "!" / "#" /        ;  characters not including
                       "$" / "%" /        ;  specials.  Used for atoms.
                       "&" / "'" /
                       "*" / "+" /
                       "-" / "/" /
                       "=" / "?" /
                       "^" / "_" /
                       "`" / "{" /
                       "|" / "}" /
                       "~"

Это не те же правила, что и в RFC 5322 .Как я могу проверить, что адрес соответствует этим правилам в Java?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 09 февраля 2011

Вы можете использовать регулярное выражение:

[A-Za-z0-9!#$%&'*+-/=?^_`{|}~]+@[A-Za-z0-9-]+(.[A-Za-z0-9-]+)*
1 голос
/ 13 марта 2015

На самом деле, Рекомендация W3C, которую вы цитировали , предлагает регулярное выражение в качестве эквивалента для того, что они представляют как ABNF, который определяет действительный адрес электронной почты:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

Но это регулярное выражение соответствует недействительным адресам электронной почты, таким как ".any..address. @ 123" (проверено с https://regex101.com/).

Это регулярное выражение принимает (все недействительны в адресе электронной почты, согласно Wikipedia ):

  • "" (точка) в начале локальной части
  • "" (точка) в конце локальной части
  • несколько последовательных "." (точка) в локальной части
  • только номера в доменной части

и отклоняет (действует согласно Википедии):

  • Юникод символы
  • некоторые специальные символы, разделенные кавычками (")

Обратите внимание, что W3C заявляет, что представленная ими спецификация является преднамеренным нарушением из RFC 5322 , поэтому у них есть «оправдание» для исключения действительных случаев, но, ИМХО, это не так причина для принятия неверных адресов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...