web-dev-qa-db-fra.com

Pourquoi la validation de formulaire HTML5 autorise-t-elle les courriels sans point?

J'écris une maquette très simple pour illustrer une validation de formulaire au format HTML5. Cependant, j’ai remarqué que la validation de l’e-mail ne vérifie pas la présence d’un point dans l’adresse, ni les caractères qui le suivent.

En d'autres termes, "john @ doe" est considéré comme valide, alors que ce n'est clairement pas une adresse électronique valide. "doe" n'est pas un domaine.

Voici comment je code mon champ email:

<input type="email" required />

N'est-ce pas assez?

Vérifiez ceci violon pour voir ce que je veux dire.

Remarque: je sais comment accomplir cela via un modèle RegEx. Je me demande simplement comment quelqu'un pourrait utiliser le type de courrier électronique à la place.

99
WEFX

Parce que a @ b est une adresse électronique valide (par exemple, localhost est un domaine valide). Voir http://en.wikipedia.org/wiki/Email_address#Examples

De plus, n'oubliez pas que vous devez toujours effectuer la validation des entrées sur le serveur. La validation côté client doit être uniquement destinée à fournir un retour d'information à l'utilisateur et ne doit pas être utilisée, car elle peut être facilement contournée.

67
Ali Alavi

Vous pouvez théoriquement avoir une adresse sans "." dans.

Depuis techniquement, des choses telles que:

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

Sont tous les emails valides.

La validation standard HTML5 autorise donc tous les courriels valides, y compris les courriels peu communs.

Pour des explications faciles à lire (au lieu de lire les normes): http://en.wikipedia.org/wiki/Email_address#Examples

128
DBS

Essayez d'ajouter ceci à l'entrée

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

violon

32
APAD1

Le RFC 822 , chapitre 6, donne la spécification d'une adresse sous la forme augmentée Backus-Naur (BNF):

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

En utilisant cette spécification a@b est une adresse valide.

[~ # ~] met à jour [~ # ~]

Pour répondre au commentaire de Trejkaz, j'ajoute les définitions suivantes. Nous voyons que les espaces sont autorisés, mais seulement dans la chaîne entre guillemets.

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  
13
Ortomala Lokni

Sur cette page MDN, il indique que les navigateurs regex doivent utiliser pour valider le courrier électronique:

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

Vous pouvez légèrement changer cette expression rationnelle pour exiger au moins un point dans le nom de domaine: changez l'étoile * à la fin de la regex à un plus +. Puis utilisez cette expression rationnelle comme attribut 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>
6
gitaarik

Vous pouvez personnaliser le modèle du champ email:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="[email protected]" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="[email protected]" />
3
Dorian