5474 Stimmen

Wie lässt sich eine E-Mail-Adresse am besten in JavaScript validieren?

Wie kann ich eine E-Mail-Adresse in JavaScript am besten mit einem regulären Ausdruck überprüfen?

23 Stimmen

@Alex Der Grund, warum ich diesen Kommentar hinzugefügt habe, ist, dass die vorgeschlagene Regex in der akzeptierten Antwort keine existierenden Live-E-Mail-Adressen zulässt, was ein schlechter Start für einen Kunden ist, und das wirklich große Problem ist, dass selbst WENN die Adresse akzeptiert wurde, sie immer noch nicht sagt, ob sie funktioniert. Die einzige Möglichkeit, zuverlässig zu überprüfen, ob eine angegebene E-Mail eine funktionierende, gültige E-Mail ist, besteht darin, eine E-Mail mit einem Verifizierungslink zu senden. Wenn Ihr Anwendungsfall also keine Verifizierung der E-Mail erfordert, genügt ein minimaler Test auf @, andernfalls sollten Sie eine Verifizierungs-E-Mail verwenden. Regex wird nur eine schlechte Benutzererfahrung bieten.

0 Stimmen

@David Mårtensson Ich habe ein + auf Ihre Gedanken hinzugefügt. Ich denke jedoch, dass eine Verifizierungs-E-Mail-Link-Sache auch eine schlechte Benutzererfahrung sein kann. Eine, die Sie einen Kunden verlieren kann.

7 Stimmen

@mikael1000 Sicher, aber was ist der Zweck einer Regex-Validierung, wenn man sowieso nicht weiß, ob es eine gültige E-Mail ist. Wenn Sie den Kunden nicht mit einem Validierungslink belästigen wollen, machen Sie einfach die einfachste Validierung <irgendwas> bei <irgendwas> und belassen es dabei. Damit stellen Sie sicher, dass der Kunde zumindest etwas eingegeben hat, das eine E-Mail sein könnte, alles andere ist meist Codeverschwendung, bis Sie zur eigentlichen Validierung kommen. Sie könnten möglicherweise überprüfen, ob die Domäne mit einem DNS-Lookup existiert.

327voto

Anoop Punkte 22416

HTML5 selbst verfügt über eine E-Mail-Validierung. Wenn Ihr Browser HTML5 unterstützt, können Sie den folgenden Code verwenden.

<form>
  <input type="email" placeholder="me@example.com" required>
  <input type="submit">
</form>

jsFiddle Link

Von der HTML5-Spezifikation :

A gültige E-Mail Adresse ist eine Zeichenkette, die mit der email Produktion der folgenden ABNF, deren Zeichensatz Unicode ist.

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

Diese Anforderung ist eine vorsätzliche Verletzung des RFC 5322, der eine Syntax für E-Mail-Adressen definiert, die gleichzeitig zu streng (vor dem "@"-Zeichen), zu vage (nach dem "@"-Zeichen) und zu lasch ist (Kommentare, Leerzeichen und Anführungszeichen in einer Weise erlaubt, 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-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

54 Stimmen

Das ist gut, aber das Problem dabei ist, dass es innerhalb einer form Tag und übermittelt von einem submit Input, was sich nicht jeder leisten kann. Außerdem kann man die Fehlermeldung nicht wirklich gestalten.

0 Stimmen

Zuerst fand ich diese Antwort nützlich, aber ich versuchte es mit einer ungültigen E-Mail-Adresse und die Regex sagte, es gäbe gültige... zum Beispiel : bar@domain (Erweiterung fehlt), A@b@c@example.com (mehrere @) und so weiter (vgl. de.wikipedia.org/wiki/Email_Adresse#Beispiele ). Ich habe hier eine schöne Regex gefunden: emailregex.de

2 Stimmen

@ThomasChampion Mehrere "@" sind gültig. Der erste Punkt ist jedoch gültig.

171voto

Boldewyn Punkte 78567

In modernen Browsern können Sie auf der Antwort von @Sushil mit reinem JavaScript und dem DOM :

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

Ich habe ein Beispiel im Fiddle zusammengestellt http://jsfiddle.net/boldewyn/2b6d5/ . In Kombination mit der Merkmalserkennung und der einfachen Validierung aus Squirtle's Antwort Es befreit Sie von dem Massaker der regulären Ausdrücke und funktioniert auch in alten Browsern einwandfrei.

8 Stimmen

Dies sollte bei weitem die akzeptierte Antwort sein. Überlassen Sie es den Browseranbietern, die über eigene Regex-Gurus verfügen, massiv komplizierte Regexe für E-Mail-Adressen zu pflegen. Der durchschnittliche Frontend-Entwickler, der ein Formular zum Sammeln von E-Mails erstellt, hat nicht oft die Zeit, ausführliche Regex zu beherrschen. Ja, Sie müssen sich auf die Regex verlassen, die der Anbieter zur Verfügung stellt, aber wenn Sie etwas Komplexeres brauchen, machen Sie es auf dem Server und oder senden Sie eine echte E-Mail und überprüfen Sie die Antwort

0 Stimmen

Dies ist die nahezu perfekte Lösung. Die einzige Kleinigkeit, die hinzugefügt werden sollte, ist eine Prüfung auf leere Felder. Der HTML5-Typ "E-Mail" akzeptiert eine leere Zeichenfolge als gültige Eingabe.

0 Stimmen

Das ist es, was die input.required = true; Zeile sollte genügen ;-)

95voto

Ben Scheirman Punkte 39742

JavaScript kann mit einem regulären Ausdruck übereinstimmen:

emailAddress.match( / some_regex /);

Hier ist ein RFC22 regulärer Ausdruck für E-Mails:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

3 Stimmen

@Kato: Es verwendet einige inkompatible Erweiterungen, darunter (?> um die Rückverfolgung zu beenden und (?<angle><)…(?(angle)>) um zu vermeiden, dass eine langwierige | .

0 Stimmen

En match Methode gibt ein Array zurück, die test Methode, die einen Booleschen Wert zurückgibt, wäre für diese Situation besser geeignet.

91voto

Colonel Panic Punkte 125419

Alle E-Mail-Adressen enthalten ein "at"-Symbol (d. h. @). Testen Sie diese notwendige Bedingung:

email.includes('@')

Oder, wenn Sie IE/ältere Browser unterstützen müssen:

email.indexOf('@') > 0

Machen Sie sich nicht die Mühe mit etwas Komplizierterem. Selbst wenn Sie einwandfrei feststellen könnten, ob eine E-Mail RFC-syntaktisch gültig ist, würde das nichts darüber aussagen, ob sie der Person gehört, die sie geschickt hat. Das ist das, was wirklich zählt.

Um dies zu testen, senden Sie eine Validierungsnachricht.

23 Stimmen

Was ist, wenn es mehr als ein '@'-Symbol gibt? andere eingeschränkte Symbole? Dieser Validierung kann man nicht trauen...

0 Stimmen

Ist a@b eine gültige E-Mail?

4 Stimmen

Es ist besser als die meisten, ja, Sie könnten mehr als ein @ damit haben, aber das könnte auch eine gültige E-Mail sein wie "@"@mydomain.jskd oder elldffs(das ist ein @-Kommentar)@mydomain.kjfdij. Beides sind syntaktisch gültige Emails

87voto

Miloš Rašić Punkte 2099

Die korrekte Validierung von E-Mail-Adressen in Übereinstimmung mit den RFCs lässt sich nicht mit einem einzeiligen regulären Ausdruck erreichen. Ein Artikel mit der besten Lösung, die ich in PHP gefunden habe, ist Was ist eine gültige E-Mail-Adresse? . Offensichtlich wurde es nach Java portiert. Ich denke, die Funktion ist zu komplex, um in JavaScript portiert und verwendet zu werden. JavaScript/node.js-Anschluss: https://www.npmjs.com/package/email-addresses .

Eine gute Praxis ist es, die Daten auf dem Client zu validieren, aber die Validierung auf dem Server zu überprüfen. So können Sie einfach prüfen, ob eine Zeichenfolge auf dem Client wie eine gültige E-Mail-Adresse aussieht, und die strenge Prüfung auf dem Server durchführen.

Hier ist die JavaScript-Funktion, die ich verwende, um zu prüfen, ob eine Zeichenkette wie eine gültige Mail-Adresse aussieht:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

Erläuterung:

  • lastAtPos < lastDotPos : Zuletzt @ sollte vor dem letzten sein . seit @ kann nicht Teil des Servernamens sein (soweit ich weiß).

  • lastAtPos > 0 : Es sollte etwas (der E-Mail-Benutzername) vor dem letzten @ .

  • str.indexOf('@@') == -1 : Es sollte keine @@ in der Adresse. Auch wenn @ als letztes Zeichen im E-Mail-Benutzernamen erscheint, muss es in Anführungszeichen gesetzt werden, also " wäre zwischen diesem @ und die letzte @ in der Adresse.

  • lastDotPos > 2 : Vor dem letzten Punkt sollten mindestens drei Zeichen stehen, zum Beispiel a@b.com .

  • (str.length - lastDotPos) > 2 : Nach dem letzten Punkt sollten genügend Zeichen vorhanden sein, um eine zweistellige Domäne zu bilden. Ich bin nicht sicher, ob die Klammern notwendig sind.

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