Есть ли реализация Java для проверки правильности ввода HTML5?

Я хотел бы использовать новый элемент <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?

Спасибо!

Ответ 1

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

[A-Za-z0-9!#$%&'*+-/=?^_`{|}~][email protected][A-Za-z0-9-]+(.[A-Za-z0-9-]+)*

Ответ 2

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

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][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, поэтому у них есть "оправдание", чтобы оставить допустимые случаи, но IMHO это не повод для принятия неверных адресов.

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