Чому HTML5 перевірка форми дозволяє електронну пошту без крапки?


113

Я пишу дуже простий макет, щоб продемонструвати деяку перевірку форм HTML5. Однак, я помітив, що перевірка електронної пошти не перевіряє крапку в адресі, а також не перевіряє символів, які слідують за вказаною крапкою.

Іншими словами, "john @ doe" вважається дійсним, коли явно не є дійсною адресою електронної пошти; "doe" - не домен.

Ось як я кодую своє поле електронної пошти:

<input type="email" required />

Це недостатньо?

Перевірте цю загадку, щоб побачити, що я маю на увазі.

Примітка. Я знаю, як це досягти за допомогою шаблону RegEx. Мені просто цікаво, як хтось може замість цього скористатися типом електронної пошти.


10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Так, doeбезумовно , може бути домен (подумайте localhost), і ця адреса технічно достовірна за специфікацією.
admdrew

2
@admdrew Хе ... це був би цікавий випадок, якщо ви надсилаєте електронний лист від самого сервера пошти і вирішите написати "друг @ localhost"
Katana314

@ Katana314 - хе, юп. Більшість (добре налаштованих) поштових серверів буде відхиляти повідомлення, що надсилаються на адреси, які не відповідають очікуваному домену, тому загалом кажучи, немає проблем з localhostадресами.
admdrew

Відповіді:


84

Тому що @ b - дійсна адреса електронної пошти (наприклад, localhost - дійсний домен). Дивіться http://en.wikipedia.org/wiki/Email_address#Examples

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


7
Дякую. Я просто не бачу, як будь-яка компанія могла отримати користь від цієї перевірки електронної пошти, яка не випускається з коробки. Facebook не дозволив би комусь зареєструватися з адресою @ b. Дякую за інформацію, хоча. (Я не відповів на вашу відповідь)
WEFX

6
У випадку таких веб-сайтів, як Facebook з загальнодоступним доступом, це не приносить користі. Але подумайте про внутрішні веб-сайти. Можливо, ви захочете написати на joe @ support. Але я також вважаю, що це мінімум використання. Тим не менш, веб-браузери повинні реалізовуватись на основі стандартів (тобто RFC), а не на основі найбільш поширених випадків.
Алі Алаві

9
Цікаво, коли востаннє хтось фактично надіслав електронний лист до localhost!
Меттью Лок

2
Як Sidenote один з найкоротших адрес електронної пошти (робочий recordsetter.com/world-record/shortest-email-address/4327 ) єau@ua
Kyborek

132

Теоретично ви можете мати адресу без "." в.

Що стосується технічних речей, таких як:

user@com
user@localserver
user@[IPv6:2001:db8::1]

Чи всі справжні електронні листи.

Таким чином, стандартна перевірка HTML5 дозволяє використовувати всі дійсні електронні листи, включаючи звичайні.

Деякі легкі для читання пояснення (замість того, щоб читати стандарти): http://en.wikipedia.org/wiki/Email_address#Examples


1
Погоджено, цей відповідає на "чому", а не на "рішення". Мені також було цікаво, чому. Тепер я знаю, що не «виправити».
Елеонора Циммерман

Прикладом першого типу є домен uz, який безпосередньо вказує на IP станом на жовтень 2018 року. Якщо ви це зробите nslookup uz, він вказує на це 91.212.89.8, тому має бути можливим мати електронну пошту і на цьому домені.
PulseJet

36

Спробуйте додати це до вводу

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

Скрипка


2
Маючи багато нових доменів, тобто (бухгалтерів [11], міжнародних [13] тощо) та потенційної максимальної довжини 63, значення довжини шаблону регулярного виразів має бути {2, 63}.
unasAquila

42
-1. По-перше, ви навіть не намагалися пояснити, що це дозволяє чи обмежує, і чому хтось хотів би цих правил. По-друге, він набагато більш обмежуючий, ніж це дозволяють стандарти (я не буду робити вигляд, що я читав і переробляв стандарти, але дивіться, наприклад, en.wikipedia.org/wiki/Email_address#Internationalization або багато питань перевірки електронної пошти на Stack Переповнення для прикладів дивних електронних адрес). Навіщо це робити? Якщо хтось вводить щось незвичне як їх електронний лист, просто прийміть це - швидше за все, вони знають краще за вас.
Марк Амері

7
Власне, я б сказав, що "шанси" на те, що вони роблять помилку. Можливо, у них є дуже незвична адреса електронної пошти, але я б сказав, що більшість разів ви просто отримуватимете правильну адресу електронної пошти замість неправильної, якби ви зупинили її проходження перевірки та підказали користувач для перевірки.
Джефф Кендалл

1
У цьому повинен бути ^, позначаючи, що він повинен починати збіг з початку рядка, а також приймати верхній регістр:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Кох'я Бріз

13

RFC 822 , глава 6, дає специфікацію адреси в доповненої Backus-Наура (BNF):

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

Використовуючи цю специфікацію a@b є дійсною адресою.

ОНОВЛЕННЯ

Щоб відповісти на коментар Трейказу, я додаю наступні визначення. Ми бачимо, що SPACE дозволений, але тільки в цитованому рядку.

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL> 
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR  

OTOH, RFC 822 також дозволяє мені розміщувати пробіли в локальній частині, що, принаймні, не дозволяє Chrome, тому я не впевнений, що вони використовують RFC як посилання. (Хоч вони і повинні бути!)
Трейказ

8

На цій сторінці MDN показано, що браузери регулярного виразу повинні використовувати для перевірки електронної пошти:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

Ви можете злегка змінити цей регулярний вираз, щоб вимагати хоча б однієї крапки в доменному імені: змінити зірку *в кінці регулярного виразу на плюс +. Потім використовуйте цей регулярний вираз як patternатрибут:

<input type="email" pattern="^[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])?)+$"></input>

3

Ви можете налаштувати шаблон поля електронної пошти:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="a@b.c" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />


2

Ось як це можна зробити за допомогою html5 за допомогою шаблону регулярного вираження. Ви також можете включити спеціальне повідомлення для відображення.

<form>
  <input type="email" value="paul@test" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" title="Hey, you are missing domain part in the email !!!"/>
  <button type="submit">Click Me</button>
</form>


-5

Ця модель завжди працює для мене.

Текст повинен бути малі, pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"але я думаю, що він охоплює більш-менш більшість електронних листів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.