Warum ist jQuerys E-Mail-Validierung Regex so einfach?

8

Wir alle wissen, dass ein Regex zur korrekten Validierung von E-Mails ziemlich kompliziert ist. Allerdings hat jQuerys Validierungs-Plugin einen kürzeren Regex (Beitrag von Scott Gonzalez ) , der nur einige wenige umfasst Zeilen:

%Vor%

Warum ist das so 'einfach' verglichen mit der bekannteren Monstrosität? Gibt es Fälle, in denen eine Regex fehlschlägt und die andere erfolgreich wäre (ob es sich um gültige oder ungültige E-Mails handelt)?

    
configurator 01.12.2010, 02:00
quelle

2 Antworten

10

Die Regex ist eine benutzerdefinierte Kombination aus:

  • RFC 2234 ABNF
  • RFC 2396 generische URI-Syntax (obseleted von RFC 3986)
  • RFC 2616 Hypertext Transfer Protocol - HTTP / 1.1
  • RFC 2822 Internet Nachrichtenformat
  • RFC 3987 IRI
  • RFC 3986 URI Generische Syntax

Ich habe die Regex geschrieben, als Web Forms 2.0 entworfen wurde und RFC 5322 nicht existieren. Wenn Sie sich die Reihenfolge ansehen, in der die RFCs geschrieben wurden, werden Sie bemerken, dass die Definition für IRI und URI geändert wurde, nachdem das Internet Message Format geschrieben wurde. Dies bedeutet, dass RFC 2822 keine aktuellen IRI-Definitionen unterstützt. Leider war es keine einfache Aufgabe, Definitionen einfach zu ersetzen, also musste ich auswählen, welche Definitionen aus welchen RFCs zu verwenden sind. Ich habe auch Entscheidungen getroffen, was zu entfernen ist (wie Unterstützung für Kommentare).

Die Regex ist nicht vollständig handgeschrieben. Während ich jeden Abschnitt der Regex manuell schrieb, schrieb ich den "Kleber". Jede Definition aus den RFCs wird in einer Variablen gespeichert, wobei zusammengesetzte Definitionen die Variablen verwenden, die die einfacheren Definitionen speichern (@Walf: deshalb gibt es so viele Untermuster und Ors).

Um die Angelegenheit zu komplizieren, wird die Version des Regex, die im jQuery-Validierungs-Plugin verwendet wird, noch weiter modifiziert, um Unterschiede zwischen spezifizierten Adressen und der Erwartung der Benutzer an eine gültige Adresse zu berücksichtigen. Ich habe keine Erinnerung daran, welche Änderungen ich vorgenommen habe. Ich habe Jörn Zaefferer (dem Autor des Validierungs-Plugins) versprochen, dass ich ein neueres Skript schreiben würde, um die Regex zu generieren. Mit dem neuen Skript können Sie Optionen für das festlegen, was Sie tun und nicht unterstützen möchten (erforderliche TLD, spezifische TLDs, IPv6, Kommentare, veraltete Definitionen, zitierte lokale Namen usw.). Das war vor 5 Jahren. Ich habe es einmal angefangen, aber nie beendet. Vielleicht werde ich es eines Tages tun. Was ich bisher habe, ist auf GitHub gehostet: Ссылка

Wenn Sie eine Regex für die Validierung von E-Mail-Adressen wünschen, würde ich die folgende Regex vorschlagen, die in der 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])?)*$/

Wenn Sie regex-builder verwenden und alle Optionen ausschalten, erhalten Sie etwas Ähnliches. Aber es ist ungefähr ein Jahr her, seit ich das gesehen habe, also kann ich mich nicht mehr daran erinnern, was die Unterschiede sind.

Ich möchte auch darauf hinweisen, dass der Link in der ursprünglichen Frage RFC 822 ausdrücklich erwähnt. Während es großartig ist, dass RFC 822 uns von Arpanet zum ARPA-Internet brachte, ist dies nicht gerade aktuell. Das Internet hat in den letzten drei Jahrzehnten einige Fortschritte gemacht und dieses RFC wurde zweimal ersetzt. Ich würde gerne neue Arbeiten nach den neuesten Standards sehen.

UPDATE:

Ein Freund fragte mich, warum der HTML5-Regex UTF-8 nicht unterstützt. Ich habe Hixie nie danach gefragt, aber ich vermute, dass dies der Grund ist: Obwohl einige TLDs IDNs (International Domain Names) im Jahr 2000 zu unterstützen begannen und RFC 3987 (IRI) 2005 geschrieben wurde, als RFC 5322 im Jahr 2008 geschrieben wurde Es wurden nur Zeichen in den Bereichen 33-90 und 94-126 als gültiger Text aufgelistet (Zeichen, die in einem Domänenliteral zulässig sind). HTML5 basiert auf RFC 5322 und daher gibt es keine UTF-8-Unterstützung. Es ist sicherlich seltsam, dass RFC 5322 IDNs nicht berücksichtigt, aber es ist nichts wert, dass selbst IDNs 2008 nicht wirklich verwendbar waren. Erst im Jahr 2010 genehmigte ICANN den ersten Satz von IDNs. Aber selbst heute, wenn Sie eine IDN verwenden möchten, müssen Sie Ihren Domain-Namen mit Punycode zerstören, wenn Sie wirklich wollen, dass E-Mail und DNS global funktionieren.

UPDATE 2:

Aktualisierte HTML5-Regex, um der aktualisierten Spezifikation zu entsprechen, die die Längenbeschränkungen für die Beschriftung von 255 auf 63 Zeichen geändert hat, wie in RFC 1034 Abschnitt 3.5 .

    
Scott González 27.03.2013, 13:09
quelle
1

Das sieht nicht gut aus: Was ist mit dem Unicode? Gegen welchen RFC wird dies validiert?

Siehe diese Antwort für eine ordnungsgemäße RFC5322-Validierung Regex.

    
tchrist 01.12.2010 02:04
quelle

Tags und Links