Validation des e-mails HTML5

102

Il est dit "Avec HTML5, nous n'avons plus besoin de js ou de code côté serveur pour vérifier si l'entrée de l'utilisateur est une adresse e-mail ou une URL valide"

Comment puis-je valider l'e-mail après l'entrée d'un utilisateur? et sans JS comment afficher un message si l'utilisateur saisit une mauvaise forme de son adresse e-mail.

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">
abcid d
la source
50
Vous devez toujours valider côté serveur. Un client intelligent peut contourner toute mesure de sécurité côté client.
Benjamin Gruenbaum
Cette réponse peut vous aider lors de la tentative de configuration de la validation de formulaire HTML5. Bien sûr, vous auriez probablement encore besoin d'une validation côté serveur.
Joeytje50
2
regex La validation des e-mails ne doit en aucun cas être utilisée. Les vérifications Regex ont trop de défauts. La meilleure façon de «valider» une adresse e-mail est de simplement lui demander de la saisir deux fois et d'exécuter une vérification Regex qui avertit l'utilisateur qu'elle ne ressemble pas à une adresse e-mail valide si elle ne correspond pas au modèle, et demande à l'utilisateur de vérifier. De cette façon, si elle est réellement valide, mais que regex échoue (comme c'est souvent le cas), l'utilisateur peut simplement reconnaître qu'il sait qu'elle est valide et continuer. Beaucoup trop de sites utilisent la validation regex et c'est frustrant pour de nombreux utilisateurs.
Soundfx4
Je recommande de consulter cet article: debounce.io/blog/articles/email-validation-for-html5-forms
Iman Hejazi
Demander à l'utilisateur de saisir deux fois la même adresse e-mail est inutile. Si vous ne connaissez pas leur adresse e-mail, demander à la taper deux fois n'améliore pas les chances. S'ils connaissent leur adresse e-mail, demander à la taper deux fois n'est qu'une mauvaise interface utilisateur.
Mikko Rantalainen le

Réponses:

120

En HTML5, vous pouvez faire comme ceci:

<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>

Et lorsque l'utilisateur appuie sur Soumettre, il affiche automatiquement un message d'erreur comme:

Message d'erreur

Député de Midhun
la source
3
Quel est l'avantage du modèle ici? La spécification du type comme e-mail inclut déjà un modèle intégré pour le déterminer.
Rich Bradshaw
3
@RichBradshaw: Oui, vous avez raison. Pas besoin de spécifier le modèle (je viens de copier le code de OP, j'ai corrigé maintenant :))
Midhun MP
6
@MichaelDeMutis: Vous pouvez utiliser l' requiredattribut
Midhun MP
29
l'e-mail n'est pas vérifié .comdans un e-mail. Il ne vérifie que le signe @. Ex. Je peux entrer example@gmailet enregistrer le formulaire. bien que ce ne soit pas une adresse e-mail valide. Existe-t-il une solution de contournement pour vérifier correctement [email protected]?
Ruchika
9
@Liz. example@gmailpeut ne pas être un e-mail valide, mais c'est un format d'adresse e-mail valide.
pajaja du
47

La input type=emailpage du site www.w3.org note qu'une adresse e-mail est toute chaîne qui correspond à l'expression régulière suivante:

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

Utilisez l' requiredattribut et un patternattribut pour exiger que la valeur corresponde au modèle d'expression régulière.

<input
    type="text"
    pattern="/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"
    required
>
Stefan Ciprian Hotoleanu
la source
14
Vous devez insérer le motif sans les deux symboles «/» et de début «^» et de fin «$». Comme ceux[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
Victor
4
@Victor Désolé, mais vous vous trompez partiellement. Ces symboles sont importants sans eux, le motif commencera à correspondre partout dans la chaîne et le rendra inutile. Là où vous avez raison, c'est de laisser sortir les barres obliques.
Hexodus
@Victor votre réponse a fonctionné pour moi. L'expression régulière OP m'a donné un faux dicton positif pour répondre aux exigences du formulaire, même s'il s'agit d'une adresse e-mail valide. C'est peut-être parce que je n'utilise pas de HTML standard, mais que j'utilise React JS pour rendre le formulaire HTML.
Ka Mok
J'ai presque voté contre cela car la bonne réponse est d'utiliser type="email"et de vérifier la validpropriété booléenne sur le DOMNode - pas besoin de répéter l'expression régulière sous-jacente
Dominic
Merci de l'avoir mentionné.
Stefan Ciprian Hotoleanu
17

Utilisation [a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}pour [email protected]/[email protected]

Van Nguyen
la source
4
Cette expression régulière place un certain nombre d'exigences inappropriées sur les adresses e-mail - par exemple, elle rejette les adresses e-mail qui ont un nom d'utilisateur à une ou deux lettres, ou qui sont hébergées sur un nom de domaine à une lettre.
duskwuff -inactif-
Édité. Merci @duskwuff
Van Nguyen
Rejette toujours les noms de domaine à une lettre.
duskwuff -inactif-
Cela autorise les domaines à 1 lettre / nombre: [a-zA-Z0-9.-_] {1,} @ [a-zA-Z0-9 .-] {1,} [.] {1} [a-zA -Z0-9] {2,}
gouvernail
Notez également que, par exemple, postmaster@aiest une adresse e-mail valide et que cette expression rationnelle l'interdirait également. (Source: serverfault.com/q/154991/104798 )
Mikko Rantalainen
12
document.getElementById("email").validity.valid

semble être vrai lorsque le champ est vide ou valide. Cela a également d'autres drapeaux intéressants:

entrez la description de l'image ici

Testé dans Chrome.

Nakilon
la source
8

Voici l'exemple que j'utilise pour toutes mes entrées de courrier électronique. Cet exemple est ASP.NET, mais s'applique à tout:

<asp:TextBox runat="server" class="form-control" placeholder="Contact's email" 
    name="contact_email" ID="contact_email" title="Contact's email (format: [email protected])" 
    type="email" TextMode="Email" validate="required:true"
    pattern="[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" >
</asp:TextBox>

HTML5 valide toujours l'utilisation du modèle lorsqu'il n'est pas nécessaire. Je n'en ai pas encore trouvé un qui était un faux positif.

Cela se traduit par le HTML suivant:

<input class="form-control" placeholder="Contact's email" 
    name="contact_email" id="contact_email" type="email" 
    title="Contact's email (format: [email protected])" 
    pattern="[a-zA-Z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">
Keith H.
la source
7

Je sais que vous n'êtes pas après la solution Javascript, mais il y a certaines choses telles que le message de validation personnalisé qui, d'après mon expérience, ne peut être fait qu'en utilisant JS.

En outre, en utilisant JS, vous pouvez ajouter dynamiquement la validation à tous les champs de saisie de type e-mail de votre site au lieu d'avoir à modifier chaque champ de saisie.

var validations ={
    email: [/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/, 'Please enter a valid email address']
};
$(document).ready(function(){
    // Check all the input fields of type email. This function will handle all the email addresses validations
    $("input[type=email]").change( function(){
        // Set the regular expression to validate the email 
        validation = new RegExp(validations['email'][0]);
        // validate the email value against the regular expression
        if (!validation.test(this.value)){
            // If the validation fails then we show the custom error message
            this.setCustomValidity(validations['email'][1]);
            return false;
        } else {
            // This is really important. If the validation is successful you need to reset the custom error message
            this.setCustomValidity('');
        }
    });
})
karic83
la source
S'il vous plaît, ne postez pas seulement des réponses de lien. Il suffit de mettre les parties essentielles du lien dans votre réponse
Rizier123
4

Un peu en retard pour la fête, mais cette expression régulière m'a aidé à valider l'entrée de type d'e-mail côté client. Cependant, nous devrions toujours faire la vérification côté serveur également.

<input type="email" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">

Vous pouvez trouver plus de regex de toutes sortes ici .

nbsamar
la source
4

TL; DR: La seule méthode correcte à 100% est de vérifier @ -sign quelque part dans l'adresse e-mail saisie, puis de publier un message de validation à l'adresse e-mail donnée. S'ils peuvent suivre les instructions de validation dans l'e-mail , l'adresse e-mail saisie est correcte.

Longue réponse:

David Gilbertson a écrit à ce sujet il y a des années:

Nous devons nous poser deux questions:

  1. L'utilisateur a-t-il compris qu'il était censé saisir une adresse e-mail dans ce champ?
  2. L'utilisateur a-t-il correctement saisi sa propre adresse e-mail dans ce champ?

Si vous avez un formulaire bien présenté avec une étiquette qui dit «e-mail» et que l'utilisateur entre un symbole «@» quelque part, alors il est sûr de dire qu'il a compris qu'il était censé entrer une adresse e-mail. Facile.

Ensuite, nous voulons faire une validation pour vérifier s'ils ont correctement saisi leur adresse e-mail.

Pas possible.

[...]

Toute erreur de saisie entraînera certainement une adresse e-mail incorrecte , mais peut- être seulement une adresse e-mail invalide .

[...]

Il ne sert à rien d'essayer de déterminer si une adresse e-mail est «valide». Un utilisateur est beaucoup plus susceptible de saisir une adresse e-mail incorrecte et valide que de saisir une adresse non valide .

En d'autres termes, il est important de noter que tout type de validation basée sur une chaîne ne peut vérifier que si la syntaxe n'est pas valide. Il ne peut pas vérifier si l'utilisateur peut réellement voir l'e-mail (par exemple parce que l'utilisateur a déjà perdu les informations d'identification, l'adresse tapée de quelqu'un d'autre ou un e-mail professionnel tapé au lieu de l'adresse e-mail personnelle pour un cas d'utilisation donné). À quelle fréquence la question que vous recherchez est " Cet e-mail est-il syntaxiquement valide " au lieu de " Puis-je communiquer avec l'utilisateur en utilisant une adresse e-mail donnée "? Si vous validez la chaîne plus que "contient-elle @", vous essayez de répondre à l'ancienne question! Personnellement, je ne suis toujours intéressé que par cette dernière question.

De plus, certaines adresses e-mail qui peuvent être syntaxiquement ou politiquement invalides fonctionnent. Par exemple, postmaster@aifonctionne techniquement même si les TLD ne doivent pas avoir d'enregistrements MX . Voir également la discussion sur la validation des e-mails sur la liste de diffusion WHATWG (où HTML5 est conçu en premier lieu).

Mikko Rantalainen
la source
2

En utilisant HTML 5, créez simplement l'e-mail d'entrée comme:

<input type="email"/>

Lorsque l'utilisateur survole la zone de saisie, une info-bulle lui demande de saisir un e-mail valide. Cependant, les formulaires Bootstrap ont un bien meilleur message d'info-bulle pour indiquer à l'utilisateur de saisir une adresse e-mail et il apparaît au moment où la valeur saisie ne correspond pas à un e-mail valide.

Fabian Madurai
la source
Mais cela n'invalide pas les cas comme "abc @ gmail".
nbsamar le
oui je pense que oui, je voudrais valider si l'utilisateur met gmail ou hotmail par exemple si mon utilisateur met autre alors ne les laisse pas continuer avec ma connexion, savez-vous comment puis-je faire cela?
simon le
2

Vous pouvez également suivre ce modèle

<form action="/action_page.php">
  E-mail: <input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
  <input type="submit">
</form>

Réf: Dans W3Schools

skpaik
la source
1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [[email protected]].">vous pouvez également ajouter un titre pour afficher un message de validité.
imdzeeshan
1

Selon MDN , ce RegExp permet de valider les e-mails, car les e-mails qui répondent aux spécifications doivent y correspondre.

/^[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])?)*$/
ZachT112
la source
0

Il est très difficile de valider correctement les e-mails en utilisant simplement l'attribut HTML5 «modèle». Si vous n'utilisez pas de "modèle", quelqu'un @ sera traité. qui n'est PAS un e-mail valide.

L'utilisation pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"nécessitera que le format soit [email protected]cependant si l'expéditeur a un format comme [email protected](ou similaire) ne sera pas validé pour résoudre ce problème, vous pourriez mettre pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"cela validera ".com.au ou .net.au ou similaire.

Cependant, en utilisant cela, cela ne permettra pas à quelqu'[email protected] de valider. Donc, la simple utilisation de HTML5 pour valider les adresses e-mail n'est toujours pas totalement avec nous. Pour compléter cela, vous utiliseriez quelque chose comme ceci:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

ou:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

Cependant, je ne sais pas comment valider les deux ou toutes les versions d'adresses e-mail à l'aide de l'attribut de modèle HTML5.

Keith
la source
1
Les vérifications regex ne doivent en aucun cas être utilisées. Il y a trop de modèles et ils ont trop de défauts. Par exemple, quelqu'[email protected] est considéré comme invalide pour de nombreuses vérifications de regex alors qu'en fait, il est valide à 100%. Regex est une épine dans le mien et de nombreux autres utilisateurs et il doit disparaître. Une méthode alternative pour s'assurer qu'un utilisateur entre une adresse e-mail valide doit être utilisée.
Soundfx4
Notez également que, par exemple, postmaster@aiest une adresse e-mail valide et que cette expression rationnelle l'interdirait également. (Source: serverfault.com/q/154991/104798 )
Mikko Rantalainen
L' outil de validation des e- mails comme DeBounce est également recommandé avec HTML5.
Iman Hejazi