4146 Stimmen

Wie kann ich eine E-Mail-Adresse mithilfe eines regulären Ausdrucks überprüfen?

Im Laufe der Jahre habe ich langsam eine regulärer Ausdruck die die Gültigkeit Die meisten E-Mail-Adressen korrekt, vorausgesetzt, sie verwenden keine IP-Adresse als Serverteil.

Ich verwende es in mehreren PHP-Programmen, und es funktioniert die meiste Zeit. Von Zeit zu Zeit werde ich jedoch von jemandem kontaktiert, der Probleme mit einer Website hat, die es verwendet, und ich muss dann einige Anpassungen vornehmen (vor kurzem habe ich festgestellt, dass ich keine vierstelligen Buchstaben zulasse TLDs ).

Was ist der beste reguläre Ausdruck, den Sie haben oder gesehen haben, um E-Mails zu validieren?

Ich habe mehrere Lösungen gesehen, die Funktionen verwenden, die mehrere kürzere Ausdrücke verwenden, aber ich hätte lieber einen langen komplexen Ausdruck in einer einfachen Funktion als mehrere kurze Ausdrücke in einer komplexeren Funktion.

10 Stimmen

Der Regex, der überprüfen kann, ob eine IDNA korrekt formatiert ist, passt nicht in Stackexchange. (die Regeln für die Kanonisierung sind sehr umständlich und eignen sich besonders schlecht für die Regex-Verarbeitung)

13 Stimmen

0 Stimmen

Die Regexe können sein variabel denn in manchen Fällen kann eine E-Mail ein Leerzeichen enthalten, in anderen Fällen darf sie keine Leerzeichen enthalten.

341voto

Josh Stodola Punkte 79569

Per die W3C HTML5-Spezifikation :

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

Kontext:

A gültige E-Mail Adresse ist eine Zeichenkette, die der ABNF-Produktion [ ] entspricht.

Anmerkung: Diese Anforderung ist eine vorsätzliche Verletzung de RFC 5322 die eine Syntax für E-Mail-Adressen definiert, die gleichzeitig zu streng (vor dem "@"-Zeichen), zu vage (nach dem "@"-Zeichen) und zu lasch ist (sie erlaubt Kommentare, Leerzeichen und Anführungszeichen in einer Weise, die den meisten Benutzern unbekannt ist), um hier von praktischem Nutzen zu sein.

Der folgende JavaScript- und Perl-kompatible reguläre Ausdruck ist eine Implementierung der obigen Definition.

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

13 Stimmen

Das ist interessant. Es ist ein Verstoß gegen die RFC, aber ein vorsätzlicher, und er ist sinnvoll. Ein Beispiel aus der realen Welt: Google Mail ignoriert Punkte im Teil vor dem @. Wenn Ihre E-Mail test@gmail.com lautet, können Sie also E-Mails an test.@gmail.com oder test....@gmail.com senden, wobei beide Adressen laut RFC ungültig, aber in der realen Welt gültig sind.

1 Stimmen

Ich denke, der letzte Teil sollte '+' statt '*' sein: ^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?: \. [a-zA-Z0-9-]+)+$

11 Stimmen

@mmmmmmm john.doe@localhost gültig ist. In einer realen Anwendung (z. B. in einer Gemeinschaft) würde ich es begrüßen, wenn Sie * durch + ersetzen würden.

299voto

Dominic Sayers Punkte 1785

[UPDATED] Ich habe alles, was ich über die Überprüfung von E-Mail-Adressen weiß, unter http://isemail.info die jetzt nicht nur validiert, sondern auch Probleme mit E-Mail-Adressen diagnostiziert. Ich stimme mit vielen der Kommentare hier überein, dass die Validierung nur ein Teil der Antwort ist; siehe meinen Aufsatz Was ist eine gültige E-Mail-Adresse? .

is_email() bleibt, soweit ich weiß, der einzige Validator, der Ihnen definitiv sagt, ob eine gegebene Zeichenkette eine gültige E-Mail-Adresse ist oder nicht. Ich habe eine neue Version hochgeladen unter http://isemail.info/

Ich habe Testfälle von Cal Henderson, Dave Child, Phil Haack und Doug Lovell gesammelt, RFC 5322 y RFC 3696 . Insgesamt 275 Testadressen. Ich habe all diese Tests mit allen kostenlosen Validierern durchgeführt, die ich finden konnte.

Ich werde versuchen, diese Seite auf dem neuesten Stand zu halten, wenn die Leute ihre Validatoren verbessern. Vielen Dank an Cal, Michael, Dave, Paul und Phil für ihre Hilfe und Mitarbeit bei der Zusammenstellung dieser Tests und ihre konstruktive Kritik an mein eigener Validator .

Die Menschen sollten sich bewusst sein, dass die Errata gegen RFC 3696 im Besonderen. Drei der kanonischen Beispiele sind in der Tat ungültige Adressen. Und die maximale Länge einer Adresse beträgt 254 oder 256 Zeichen, no 320.

0 Stimmen

Dieser Prüfer scheint ebenfalls korrekt zu sein. [Hm, sieht so aus, als ob es nur RFC 5322 ist, nicht 3693 oder Errata dazu.

2 Stimmen

Sehr schön. Hier bekommen wir nicht nur einen schönen Aufsatz, sondern auch einen Validierungstester und eine Bibliothek zum Herunterladen. Schöne Antwort!

2 Stimmen

Ihr Validator unterstützt keinen Punycode (RFC 3492). name@öäü.at kann eine gültige Adresse sein. (wird übersetzt mit name@xn--4ca9at.at)

207voto

Abigail Punkte 1

In Perl 5.10 oder neuer ist es einfach:

/(?(DEFINE)
   (?<address>         (?&mailbox) | (?&group))
   (?<mailbox>         (?&name_addr) | (?&addr_spec))
   (?<name_addr>       (?&display_name)? (?&angle_addr))
   (?<angle_addr>      (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
   (?<group>           (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
                                          (?&CFWS)?)
   (?<display_name>    (?&phrase))
   (?<mailbox_list>    (?&mailbox) (?: , (?&mailbox))*)

   (?<addr_spec>       (?&local_part) \@ (?&domain))
   (?<local_part>      (?&dot_atom) | (?&quoted_string))
   (?<domain>          (?&dot_atom) | (?&domain_literal))
   (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                 \] (?&CFWS)?)
   (?<dcontent>        (?&dtext) | (?&quoted_pair))
   (?<dtext>           (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])

   (?<atext>           (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
   (?<atom>            (?&CFWS)? (?&atext)+ (?&CFWS)?)
   (?<dot_atom>        (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
   (?<dot_atom_text>   (?&atext)+ (?: \. (?&atext)+)*)

   (?<text>            [\x01-\x09\x0b\x0c\x0e-\x7f])
   (?<quoted_pair>     \\ (?&text))

   (?<qtext>           (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
   (?<qcontent>        (?&qtext) | (?&quoted_pair))
   (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                        (?&FWS)? (?&DQUOTE) (?&CFWS)?)

   (?<word>            (?&atom) | (?&quoted_string))
   (?<phrase>          (?&word)+)

   # Folding white space
   (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
   (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
   (?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment))
   (?<comment>         \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
   (?<CFWS>            (?: (?&FWS)? (?&comment))*
                       (?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

   # No whitespace control
   (?<NO_WS_CTL>       [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])

   (?<ALPHA>           [A-Za-z])
   (?<DIGIT>           [0-9])
   (?<CRLF>            \x0d \x0a)
   (?<DQUOTE>          ")
   (?<WSP>             [\x20\x09])
 )

 (?&address)/x

22 Stimmen

Das würde ich gerne in Python sehen

4 Stimmen

Ich denke, dass nur eine Teilmenge der addrspec Teil ist wirklich relevant für die Frage. Mehr als das zu akzeptieren und es durch einen anderen Teil des Systems weiterzuleiten, der nicht bereit ist, vollständige RFC5822-Adressen zu akzeptieren, ist wie ein Schuss in den eigenen Fuß.

4 Stimmen

Toll (+1), aber technisch gesehen ist es natürlich keine Regex... (was unmöglich wäre, da die Grammatik nicht regulär ist).

201voto

Ich benutze

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

Diese wird in ASP.NET vom RegularExpressionValidator verwendet.

37 Stimmen

Buh! Meine (unbedachte) Adresse von !@mydomain.net wird abgelehnt.

5 Stimmen

Laut dieser Seite data.iana.org/TLD/tlds-alpha-by-domain.txt es gibt keine Domains mit nur einem Zeichen in der obersten Ebene, z.B. "etwas.c", "etwas.a", hier ist eine Version, die mindestens 2 Zeichen unterstützt: "irgendwas.pl", "irgendwas.us": ^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w{2,}([-.]\\w+)*$

6 Stimmen

@Wayne Whitty. Sie haben das Hauptproblem angesprochen, nämlich die Frage, ob man die überwiegende Mehrheit der Adressen berücksichtigen soll oder ALLE, einschließlich derer, die niemand benutzen würde, außer zum Testen der E-Mail-Validierung.

149voto

Chris Vest Punkte 8512

Ich weiß nicht, ob es das Beste ist, aber diese ist zumindest dann korrekt, wenn die Kommentare der Adressen entfernt und durch Leerzeichen ersetzt werden.

Ganz im Ernst. Sie sollten eine bereits geschriebene Bibliothek für die Validierung von E-Mails verwenden. Am besten ist es wahrscheinlich, einfach eine Bestätigungs-E-Mail an diese Adresse zu senden.

3 Stimmen

Soweit ich weiß, sind auch einige Bibliotheken falsch. Ich erinnere mich vage, dass PHP PEAR einen solchen Fehler hatte.

0 Stimmen

Diese Seite hat auch einen Haftungsausschluss am Ende über ein paar Dinge aus der Spezifikation, die der regexp nicht unterstützt.

7 Stimmen

Das ist eine RFC 822-Spezifikation, keine RFC 5322 spez.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X