Was wäre eine weltweit akzeptierte regulären Ausdruck für e-mail-Adressen
Ich habe gesehen, viele Beispiele, mit vielen "Nein, du verpasst etwas" - Kommentare. Was ist der richtige Weg, um die übereinstimmung mit einer e-mail-Adresse?
Für geistige Gesundheit Willen, nur voll-qualifizierten domain-Namen, nicht @localhost erlaubt. (oder beide Möglichkeiten)
Subdomains erlaubt sein muss ([email protected])
- Hinzugefügt
rfc-822
tag. - RFC-822 ist veraltet - soll-tag mit rfc-2822 statt, oder beides. Ich würde es tun, aber ich habe nicht genug rep zu Bearbeiten.
- 2822 ist zu alt, den tag mit rfc-5322.
- möglich, Duplikat der Was ist die beste regulärer Ausdruck für die Validierung von E-Mail-Adressen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese regulären Ausdruck entspricht der Grammatik beschrieben in RFC-2822, es ist sehr lang, aber die Grammatik beschrieben in der RFC-Komplex...
Ist es unmöglich, so zu tun in einer reinen regex. Regexen nicht mithalten können verschachtelte Klammern, die die vollständige RFC-Spezifikation erfordert. (Der aktuelle RFC zu diesem Thema RFC5322, nur vor einigen Monaten veröffentlicht.)
Vollständige Validierung der E-Mail-Adressen erfordert etwas entlang der Linien von CFG, und es gibt ein paar Dinge mehr, misstrauisch zu sein; zum Beispiel die E-Mail-Adressen enthalten kann
'\0'
, die null-Zeichen... also Sie können nicht alle von C die normalen string-Funktionen auf Sie.Eigentlich fühle ich mich ein bisschen komisch, die Beantwortung einer Frage mit einem link zu etwas, das ich geschrieben habe, aber wie es so passiert, ich habe eine, die ich bereits vorher zubereitet: eine kurze und (soweit ich das sagen kann) voll kompatibel validator, in Haskell; Sie können den Quellcode sehen Sie hier. Ich Stelle mir den code könnte leicht portiert ähnliche parsing-Bibliothek (vielleicht C++'s zu Steigern.Geist), oder einfach nur als leicht angespannt in einer anderen Sprache (Haskell hat eine sehr einfache Möglichkeit für Sie C, um die Verwendung von Haskell-code, und alles C-Bindungen...)
Dort sind auch umfangreiche test-Fällen in den source-code (ich wusste nicht, exportieren Sie Sie aus dem Modul), die aufgrund Dominic Sayers, wer seine eigene version eines RFC-konformen parser in PHP. (Mehrere tests fehlschlagen, Sie sind aber strenger als der RFC5322 gibt, so bin ich gut mit, dass in dem moment.)
Gefragt wurde, hier vor ein paar Wochen. Was es kommt darauf an, es gibt viele rechtliche-Adressen, so dass ein einfacher regex nicht passen. Es dauert eine wirklich verrückte regulären Ausdruck für die Mehrheit der juristischen Adressen. Und selbst dann, eine syntaktisch zulässige Adresse garantiert nicht die Existenz eines Kontos dahinter nehmen [email protected] zum Beispiel.
Nicht zu erwähnen, dass chinesische/Arabische domain-Namen sind erlaubt in der nahen Zukunft. Jeder hat zu ändern, die E-Mail-regex benutzt, weil diese Charaktere sind sicherlich nicht gedeckt durch
[a-z]/i
noch\w
. Sie werden alle scheitern.Schließlich beste Weg, um überprüfen Sie die E-Mail-Adresse ist immer noch, um tatsächlich senden Sie eine E-Mail an die Adresse in Frage, zu bestätigen die Adresse. Wenn die E-Mail-Adresse ist Teil der Benutzer-Authentifizierung (Registrierung/login,/etc), dann kannst du perfekt kombinieren Sie es mit der user-Aktivierungs-system. I. e. senden Sie eine E-Mail mit einen link mit einem einmaligen Aktivierungscode an die angegebene E-Mail-Adresse ein und erlauben nur die Anmeldung, wenn der Benutzer aktiviert das neu erstellte Konto über den link in der E-Mail.
Wenn der Zweck der regex ist einfach zu schnell informieren den Benutzer in der Benutzeroberfläche, die mit der angegebenen E-Mail-Adresse nicht Aussehen wie im richtigen format, am besten auch noch zu prüfen, ob es entspricht grundsätzlich dem folgenden regex:
Einfach ist das. Warum auf der Erde würden Sie kümmern sich um die verwendeten Zeichen in den Namen und die Domäne?
Leider, es ist nicht eine regex, aber... Der richtige Weg, um die Validierung einer E-Mail-Adresse senden Sie eine Nachricht und sehen, ob der Benutzer antwortet.
Wenn Sie wirklich, wirklich wollen, um zu überprüfen, dass eine Adresse ist syntaktisch gültig/RFC-konform ist, dann ist ein regex ist immer noch unwahrscheinlich, dass das richtige Werkzeug für den job. Sie könnte wahrscheinlich erstellen eines parser in weniger Zeichen als die Länge einer regex mit einem ähnlichen Niveau der RFC-Konformität und der parser würde wahrscheinlich schneller laufen zu Booten.
Sogar mit einem perfekten test der RFC-Konformität, [email protected] ist perfekt geformt und bezieht sich auf eine bestehende domain, so wirst du nicht zu wissen, ob die Adresse, die Sie gegeben sind tatsächlich gültig sind oder nicht, es sei denn, Sie senden eine Nachricht.
Gibt es eine weitere Diskussion über dieses hier:
Mit einem regulären Ausdruck für die Validierung einer E-Mail-Adresse
Allgemeine Rat ist nicht
Lohnt es sich wahrscheinlich, eine einfache überprüfung, die Sie eingegeben "[email protected]" nur um zu testen, ob Sie die E-Mail im rechten Feld.
Darüber hinaus, dass die meisten der offiziellen regex ermöglichen so vielen obskuren Fällen, dass Sie einen großen false-positive-rate (diese können technisch legal, aber extrem unwahrscheinlich
Einträge)
Vom http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html :
Grammatik beschrieben in RFC-822 ist erstaunlich Komplex. Umsetzung der Validierung mit regulären Ausdrücken etwas schiebt die Grenzen der was, ist es sinnvoll zu tun, mit regulären Ausdrücken, obwohl Perl gut zurecht:
Wenn Sie mit Perl, glaube ich, dass der Regex::Gemeinsames Modul wäre die, die Sie verwenden möchten, und insbesondere, Regex::Common::Email::Address.
Hatte ich bis vor kurzem aufzubauen, RSS-feeds, und Teil, die enthalten gehen über das Xml-schema, einschließlich der Elemente für Webmaster und ManagingEditor, die beide definiert sind, als eine e-mail-Adresse entsprechen diesem Muster: