2009-04-12 15 views
57

Quando gli utenti creano un account sul mio sito, desidero rendere la convalida del server per i messaggi di posta elettronica per non accettare ogni input.Qual è la più semplice espressione regolare per convalidare le e-mail per non accettarle ciecamente?

Invierò una conferma, in modo da fare un handshake validation.

Cerco qualcosa di semplice, non il migliore, ma non troppo semplice che non convalida nulla. Non so dove deve essere la limitazione, dal momento che qualsiasi espressione regolare non eseguirà la convalida corretta perché non è possibile farlo con le espressioni regolari.

Sto provando a limitare la sintassi e la complessità visiva inerente alle espressioni regolari, perché in questo caso qualsiasi sarà corretta.

Quale regexp posso usare per farlo?

+0

Il pensiero "più semplice" era esattamente come soggettivo come "il migliore", ceteris paribus, e quel thread aveva una cornucopia di espressioni regolari, ma se si pensa così ... * scrollare le spalle * –

+0

Se si esegue una convalida di espressioni regolari perché limitare l'espressione a qualcosa di semplice? Usiamo qualcosa di buono, questo non avrà alcun impatto sul tuo codice fornendo risultati migliori. – twk

risposta

69
+1

Questo corrisponderà agli indirizzi non validi. Qualsiasi regex lo farà, ma questo corrisponderà a errori di ortografia comuni come test @ stackoverflow..com (notare i doppi punti). Fornire un esempio migliore. –

+40

Si suppone che sia un filtro estremamente semplice, molto approssimativo, e non vedo perché i periodi raddoppiati siano privilegiati rispetto a tutti gli altri errori con costi di complessità simili a coprirli. – chaos

+1

+1. Questa è comunque una domanda soggettiva, e questo è semplice. –

172

E 'possibile scrivere un'espressione regolare che accettano solo indirizzi e-mail che seguono le norme. Tuttavia, ci sono alcuni indirizzi e-mail che non seguono rigorosamente gli standard, ma funzionano ancora.

Ecco alcuni semplici espressioni regolari per la convalida di base:

contiene un carattere @:

@ 

Contiene @ e un punto da qualche parte dopo che è:

@.*?\. 

ha almeno un carattere prima della @, prima del periodo e dopo:

[email protected]+\..+ 

ha un solo @, almeno un carattere prima della @, prima del periodo e dopo:

^[^@][email protected][^@]+\.[^@]+$ 

utente AmoebaMan17 suggerisce questa modifica per eliminare gli spazi bianchi:

^[^@\s][email protected][^@\s]+\.[^@\s]+$ 
+4

Hmm ... Perchè il downvote? Se non si specifica un motivo è piuttosto inutile ... – Guffa

+1

+1 per gli esempi semplici – Lijo

+0

+1 - Ottima risposta! –

2

Take your pick.

Ecco quello conforme a RFC 2822 Section 3.4.1 ...

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

Nel caso in cui sei curioso. :)

+5

Solo una nota per chiunque lo veda ora: non è conforme a RFC 2822. – porges

+9

E non è semplice, neanche :) –

+2

Bloccherà anche un host di indirizzi email validi. Soprattutto quelli che utilizzano caratteri/lingue internazionali. –

-3

"^ \ w [^ @] * @ \ w [^ @.] +. \ W [^.] {2,4} $". Non consente più di un @ o periodo, funziona benissimo finora.

Inoltre, per provare diverse espressioni regolari, scaricare Expresso da http://www.ultrapico.com/. Mi ha davvero aiutato.

+1

Questo fallirà per i domini dei paesi non statunitensi (es. [email protected]) Semplice è buono, ma probabilmente dovrebbe cadere sul lato dell'inclusione. – swilliams

1

^[a-zA-Z0-9 _. + -] + @ [a-zA-Z0-9 -] +. [A-zA-Z0-9-.] + $

  • Solo 1 @
  • Diversi domini e sottodomini
3

Penso che questo piccolo tweak per l'espressione da AmoebaMan17 dovrebbe fermare l'indirizzo da inizio/fine con un punto e anche smettere multipla punti vicini l'uno all'altro. Cercando di non renderlo nuovamente complesso eliminando un problema comune.

(?!.*\.\.)(^[^\.][^@\s][email protected][^@\s]+\.[^@\s\.]+$) 

Sembra funzionare (ma non sono RegEx-pert). Correggere il mio problema con gli utenti copia & incollando gli indirizzi e-mail dalla fine delle frasi che terminano con un punto.

i.e: Ecco il mio nuovo indirizzo e-mail [email protected]

+0

Questo non funziona per un singolo carattere prima del @ –

Problemi correlati