Convalida email HTML5


102

Si dice "Con HTML5, non abbiamo più bisogno di js o di un codice lato server per verificare se l'input dell'utente è un indirizzo email o URL valido"

Come posso convalidare l'email dopo che un utente è entrato? e senza JS come visualizzare un messaggio se l'utente inserisce una forma sbagliata del suo indirizzo email.

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">

50
Hai sempre bisogno di convalidare sul lato server. Un cliente intelligente può aggirare qualsiasi misura di sicurezza lato client.
Benjamin Gruenbaum

Questa risposta potrebbe essere utile quando si tenta di impostare la convalida del modulo HTML5. Ovviamente probabilmente avresti ancora bisogno della convalida lato server.
Joeytje50

2
La convalida delle e-mail regex non dovrebbe mai essere utilizzata in nessuna circostanza. I controlli Regex hanno troppi difetti. Il modo migliore per "convalidare" un indirizzo e-mail è semplicemente farli digitare due volte ed eseguire un controllo Regex che fornisce un AVVISO all'utente che non sembra un indirizzo e-mail valido se non corrisponde al modello, e chiede all'utente di ricontrollare. In questo modo, se è effettivamente valido, ma l'espressione regolare non funziona (come spesso accade), l'utente può semplicemente riconoscere di sapere che è valida e continuare. Troppi siti utilizzano la convalida delle espressioni regolari ed è frustrante per molti utenti.
Soundfx4


Chiedere all'utente di inserire due volte lo stesso indirizzo email è inutile. Se non conosci il loro indirizzo email, chiedere di digitarlo due volte non migliora le probabilità. Se conoscono il loro indirizzo e-mail, chiedere di digitarlo due volte è solo un'interfaccia utente scadente.
Mikko Rantalainen

Risposte:


120

In HTML5 puoi fare così:

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

E quando l'utente preme Invia, mostra automaticamente un messaggio di errore come:

Messaggio di errore


3
Qual è il vantaggio del modello qui? Specificare il tipo come e-mail include già un modello incorporato per determinarlo.
Rich Bradshaw

3
@RichBradshaw: Sì, hai ragione. Non è necessario specificare il modello (ho appena copiato il codice da OP, ora l'ho corretto :))
Midhun MP

6
@MichaelDeMutis: Puoi usare l' requiredattributo
Midhun MP

29
l'e-mail non controlla .comin un'e-mail. Controlla solo il segno @. Ex. Posso entrare example@gmaile salvare il modulo. sebbene non sia un indirizzo email valido. C'è una soluzione alternativa per controllare correttamente example@gmail.com?
Ruchika

9
@Liz. example@gmailpotrebbe non essere un indirizzo email valido ma è un formato di indirizzo email valido.
pajaja

47

La input type=emailpagina del sito www.w3.org rileva che un indirizzo di posta elettronica è una qualsiasi stringa che corrisponde alla seguente espressione regolare:

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

Utilizza l' requiredattributo e un patternattributo per richiedere che il valore corrisponda al pattern regex.

<input
    type="text"
    pattern="/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"
    required
>

14
È necessario inserire il modello senza i due simboli "/" e iniziale "^" e finale "$". Come questi[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
Victor

4
@Victor Scusa, ma in parte ti sbagli. Questi simboli sono importanti senza di essi il modello inizierà a corrispondere ovunque nella stringa e lo renderà inutile. Dove hai ragione è lasciare fuori i tagli.
Hexodus

@ Victor la tua risposta ha funzionato per me. L'espressione regolare di OP mi ha fornito un falso positivo dicendo che corrisponde ai requisiti del modulo anche quando si tratta di un indirizzo email valido. Forse non sto usando il normale HTML, ma sto usando React JS per rendere il modulo HTML.
Ka Mok

Ho quasi votato negativamente perché la risposta corretta è usare type="email"e controllare la validproprietà booleana sul DOMNode - non è necessario ripetere la regex sottostante
Dominic

Grazie per averlo menzionato.
Stefan Ciprian Hotoleanu

17

Utilizzo [a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}per somemail@email.com/somemail@email.com.vn


4
Questa regex pone una serie di requisiti inappropriati sugli indirizzi e-mail, ad esempio rifiuta gli indirizzi e-mail che hanno un nome utente di una o due lettere o che sono ospitati in un nome di dominio di una lettera.
duskwuff -inattivo-

Modificato. Grazie @duskwuff
Van Nguyen

Rifiuta ancora i nomi di dominio di una sola lettera.
duskwuff -inattivo-

Ciò consente domini di 1 lettera / numero: [a-zA-Z0-9.-_] {1,} @ [a-zA-Z0-9 .-] {1,} [.] {1} [a-zA -Z0-9] {2,}
Timone

Nota anche che, ad esempio, postmaster@aiè un indirizzo email valido e questa espressione regolare vieterebbe anche quello. (Fonte: serverfault.com/q/154991/104798 )
Mikko Rantalainen

12
document.getElementById("email").validity.valid

sembra essere vero quando il campo è vuoto o valido. Questo ha anche altre bandiere interessanti:

inserisci qui la descrizione dell'immagine

Testato in Chrome.


8

Ecco l'esempio che uso per tutti i miei input di posta elettronica del modulo. Questo esempio è ASP.NET, ma si applica a qualsiasi:

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

HTML5 convalida ancora utilizzando il modello quando non richiesto. Non ne ho ancora trovato uno che fosse un falso positivo.

Viene visualizzato come il seguente HTML:

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

7

So che non stai cercando la soluzione Javascript, tuttavia ci sono alcune cose come il messaggio di convalida personalizzato che, dalla mia esperienza, può essere fatto solo usando JS.

Inoltre, utilizzando JS, puoi aggiungere dinamicamente la convalida a tutti i campi di input di tipo email all'interno del tuo sito invece di dover modificare ogni singolo campo di input.

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('');
        }
    });
})

Per favore, non pubblicare solo risposte ai link. Inserisci le parti essenziali del link nella tua risposta
Rizier123

4

Un po 'in ritardo per la festa, ma questa espressione regolare mi ha aiutato a convalidare l'input del tipo di posta elettronica sul lato client. Tuttavia, dovremmo sempre eseguire la verifica anche sul lato server.

<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})(\]?)$">

Puoi trovare più espressioni regolari di tutti i tipi qui .


4

TL; DR: l'unico metodo corretto al 100% è controllare la presenza di @ -sign da qualche parte nell'indirizzo e-mail inserito e quindi pubblicare un messaggio di convalida all'indirizzo e-mail specificato. Se possono seguire le istruzioni di convalida nel messaggio di posta elettronica , l'indirizzo e-mail immesso è corretto.

Risposta lunga:

David Gilbertson ha scritto su questo anni fa:

Ci sono due domande che dobbiamo porre:

  1. L'utente ha capito che avrebbe dovuto digitare un indirizzo e-mail in questo campo?
  2. L'utente ha digitato correttamente il proprio indirizzo email in questo campo?

Se hai un modulo ben strutturato con un'etichetta che dice "e-mail" e l'utente inserisce un simbolo "@" da qualche parte, allora è sicuro che ha capito che avrebbe dovuto inserire un indirizzo e-mail. Facile.

Successivamente, vogliamo eseguire alcune convalide per accertare se hanno inserito correttamente il loro indirizzo email.

Non possibile.

[...]

Qualsiasi mistype sarà sicuramente portare ad un errato indirizzo e-mail, ma solo forse risultare in un invalido indirizzo email .

[...]

Non ha senso cercare di capire se un indirizzo e-mail è "valido". È molto più probabile che un utente inserisca un indirizzo e-mail errato e valido piuttosto che inserirne uno non valido .

In altre parole, è importante notare che qualsiasi tipo di convalida basata su stringa può verificare solo se la sintassi non è valida. Non può verificare se l'utente può effettivamente vedere l'e-mail (ad es. Perché l'utente ha già perso le credenziali, l'indirizzo digitato di qualcun altro o l'email di lavoro digitato invece dell'indirizzo email personale per un determinato caso d'uso). Quante volte la domanda che stai cercando è " questa email è sintatticamente valida " invece di " posso comunicare con l'utente utilizzando l'indirizzo email fornito "? Se convalidi la stringa più di "contiene @", stai cercando di rispondere alla domanda precedente! Personalmente, sono sempre interessato solo a quest'ultima domanda.

Inoltre, alcuni indirizzi e-mail che potrebbero essere sintatticamente o politicamente non validi, funzionano. Ad esempio, postmaster@aitecnicamente funziona anche se i TLD non dovrebbero avere record MX . Vedi anche la discussione sulla convalida della posta elettronica sulla mailing list WHATWG (dove HTML5 è progettato in primo luogo).


2

Utilizzando HTML 5, crea semplicemente l'email di input come:

<input type="email"/>

Quando l'utente passa con il mouse sopra la casella di input, visualizzerà un suggerimento che lo istruirà a inserire un'e-mail valida. Tuttavia, i moduli Bootstrap hanno un messaggio di descrizione comando molto migliore per dire all'utente di inserire un indirizzo e-mail e viene visualizzato nel momento in cui il valore inserito non corrisponde a un'e-mail valida.


Tuttavia, questo non invalida casi come "abc @ gmail".
nbsamar

si, penso di sì, vorrei valido se l'utente inserisce gmail o hotmail ad esempio se il mio utente ne mette altro quindi non lasciargli continuare con il mio login, sai come posso farlo?
simon

2

Puoi anche seguire questo schema

<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>

Rif: In W3Schools


1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">puoi aggiungere un titolo anche per mostrare un messaggio di validità.
imdzeeshan

1

Secondo MDN , questa RegExp va bene per convalidare le e-mail, poiché le e-mail che soddisfano le specifiche dovrebbero corrispondere.

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

0

È molto difficile convalidare correttamente l'email utilizzando semplicemente l'attributo HTML5 "pattern". Se non usi un "pattern" qualcuno @ verrà processato. che NON è un indirizzo email valido.

L'uso pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"richiederà che il formato sia, someone@email.comtuttavia se il mittente ha un formato simile someone@email.net.au(o simile) non sarà convalidato per risolvere questo problema potresti inserirepattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" questo convaliderà ".com.au o .net.au o simili.

Tuttavia, utilizzando questo, non consentirà a qualcuno@email.com di convalidare. Quindi, per quanto riguarda il semplice utilizzo di HTML5 per convalidare gli indirizzi e-mail, non è ancora totalmente con noi. Per completare questo dovresti usare qualcosa del genere:

<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>

o:

<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>

Tuttavia, non so come convalidare entrambe o tutte le versioni di indirizzi e-mail utilizzando l'attributo pattern HTML5.


1
i controlli regex non dovrebbero mai essere usati in nessuna circostanza. Ci sono troppi modelli e hanno troppi difetti. Ad esempio, qualcuno+customwordhere@email.com è considerato non valido per molti controlli regex quando, in realtà, è valido al 100%. Regex è una spina nel fianco per me e per molti altri utenti e deve sparire. È necessario utilizzare un metodo alternativo per garantire che un utente immetta un indirizzo e-mail valido.
Soundfx4

Nota anche che, ad esempio, postmaster@aiè un indirizzo email valido e questa espressione regolare vieterebbe anche quello. (Fonte: serverfault.com/q/154991/104798 )
Mikko Rantalainen

Lo strumento di convalida della posta elettronica come DeBounce è consigliato insieme a HTML5.
Iman Hejazi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.