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.

6585voto

John Rutherford Punkte 10674

Verwendung von reguläre Ausdrücke ist wahrscheinlich der beste Weg. Sie können eine Reihe von Tests sehen aquí (entnommen aus Chrom )

const validateEmail = (email) => {
  return String(email)
    .toLowerCase()
    .match(
      /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    );
};

Hier ist ein Beispiel für einen regulären Ausdruck, der Unicode akzeptiert:

const re =
  /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

Denken Sie aber daran, dass Sie sich nicht nur auf die JavaScript-Validierung verlassen sollten. JavaScript kann leicht deaktiviert werden. Dies sollte auch auf der Serverseite validiert werden.

Hier ist ein Beispiel für die oben beschriebene Vorgehensweise:

const validateEmail = (email) => {
  return email.match(
    /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  );
};

const validate = () => {
  const $result = $('#result');
  const email = $('#email').val();
  $result.text('');

  if (validateEmail(email)) {
    $result.text(email + ' is valid :)');
    $result.css('color', 'green');
  } else {
    $result.text(email + ' is not valid :(');
    $result.css('color', 'red');
  }
  return false;
}

$('#email').on('input', validate);

Und das ist die html :

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<label for="email">Enter an email address: </label>
<input id="email" />
<h2 id="result"></h2>

718 Stimmen

Diese Regex eliminiert gültige, in Gebrauch befindliche E-Mails. Nicht verwenden. Googeln Sie nach "RFC822" oder "RFC2822", um eine geeignete Regex zu erhalten.

73 Stimmen

Dabei werden nicht einmal die Beispiele in RFC 822 akzeptiert. In einigen einfachen Fällen passt es nicht zu a\@b@c.com, a(b)@c.com. Siehe den RFC für mehr. Hier ist eine Regex, die keine gültigen Adressen ablehnt [^@]+@[^@]+ \. [^@]+ und schützt vor häufigen Fehlern.

233 Stimmen

Sie können E-Mail-Adressen nicht validieren, Punkt. Der einzige, der eine E-Mail-Adresse validieren kann, ist der Anbieter der E-Mail-Adresse. Zum Beispiel sagt diese Antwort diese E-Mail-Adressen: %2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.com sind alle gültig, aber Gmail wird keine dieser E-Mail-Adressen zulassen. Sie sollten dies tun, indem Sie die E-Mail-Adresse akzeptieren und eine E-Mail-Nachricht an diese E-Mail-Adresse senden, die einen Code/Link enthält, den der Nutzer zur Bestätigung der Gültigkeit besuchen muss.

1338voto

C. Lee Punkte 3107

Ich habe leicht modifiziert Jaymon's Antwort für Leute, die eine wirklich einfache Validierung in Form von:

anystring@anystring.anystring

Der reguläre Ausdruck:

/\S+@\S+\.\S+/

Um zu verhindern, dass mehrere @-Zeichen übereinstimmen:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

Beispiel für eine JavaScript-Funktion:

function validateEmail(email) 
    {
        var re = /\S+@\S+\.\S+/;
        return re.test(email);
    }

console.log(validateEmail('anystring@anystring.anystring'));

121 Stimmen

Man kann etwas implementieren, das 20 Mal so lang ist, aber für einige wenige Benutzer Probleme verursacht und in Zukunft vielleicht nicht mehr gültig ist, oder man kann sich die Version von ImmortalFirefly schnappen, um sicherzugehen, dass sie sich wenigstens die Mühe gemacht haben, es echt aussehen zu lassen. Je nach Anwendung ist es wahrscheinlicher, dass jemand wütend wird, weil Sie seine unkonventionelle E-Mail nicht akzeptieren, als dass jemand Probleme verursacht, indem er E-Mail-Adressen eingibt, die nicht wirklich existieren (was er sowieso tun kann, indem er eine 100% gültige RFC2822-E-Mail-Adresse eingibt, aber einen nicht registrierten Benutzernamen oder eine Domäne verwendet). Hochgestuft!

133 Stimmen

@ImmortalFirefly, die von Ihnen angegebene Regex passt tatsächlich name@again@example.com . Versuchen Sie, Ihre Zeile in eine JavaScript-Konsole einzufügen. Ich glaube, Sie wollten nur den gesamten Text abgleichen, was die Operatoren "^" für den Textanfang und "$" für das Textende erfordern würde. Der von mir verwendete ist /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')

0 Stimmen

Die zweite Regexp erfordert keine Top-Level-Domain, d. h. sie akzeptiert user@domain . Aber AFAIK ist dies tatsächlich eine gültige E-Mail-Adresse, wenn auch eine ungewöhnliche. Die erste Regexp erfordert eine TLD, so dass sie diese Art von Adressen nicht abdeckt.

907voto

Esteban Küber Punkte 35006

Nur der Vollständigkeit halber, hier haben Sie eine weitere RFC 2822-konforme Regex

Die offizielle Norm ist bekannt als RFC 2822 . Sie beschreibt die Syntax, die gültige E-Mail-Adressen einhalten müssen. Sie können ( aber Sie sollten nicht - weiter lesen ) mit diesem regulären Ausdruck implementieren:

(?:[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])+)\])

(...) Wir erhalten eine praktischere Implementierung von RFC 2822, wenn wir die Syntax mit doppelten Anführungszeichen und eckigen Klammern weglassen. Sie stimmt immer noch mit 99,99 % aller heute tatsächlich verwendeten E-Mail-Adressen überein.

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

Eine weitere Änderung, die Sie vornehmen könnten, besteht darin, alle zweistelligen Ländercodes als Domänen oberster Stufe und nur bestimmte generische Domänen oberster Stufe zuzulassen. Diese Regex filtert Dummy-E-Mail-Adressen wie asdf@adsf.adsf . Sie müssen sie aktualisieren, wenn neue Top-Level-Domains hinzugefügt werden .

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

Selbst wenn man sich an offizielle Normen hält, muss man also Kompromisse eingehen. Kopieren Sie nicht blindlings reguläre Ausdrücke aus Online-Bibliotheken oder Diskussionsforen. Testen Sie sie immer an Ihren eigenen Daten und mit Ihren eigenen Anwendungen.

Hervorhebung von mir

111 Stimmen

NB: "Bei tatsächlicher Verwendung heute " mag gültig gewesen sein, als der Code geschrieben wurde, damals im Jahr 200x. Der Code se wahrscheinlich über das betreffende Jahr hinaus verwendet werden. (Hätte ich einen Cent für jedes "Ach, niemand wird jemals eine TLD mit mehr als 4 Buchstaben verwenden, außer diesen speziellen", das ich korrigieren musste, könnte ich den Weltmarkt für Kupfer und Nickel beherrschen ;))

5 Stimmen

Beachten Sie, dass einige gültige E-Mail-Adressen, wie diese Emoji, nicht erfasst werden: mailoji.de

10 Stimmen

@Toastrackenigma wenn jemand eine Emoji-E-Mail verwendet, verdient er es nicht, meine Website zu abonnieren. So einfach ist das.

531voto

Jaymon Punkte 4528

Wow, hier gibt es viel Komplexität. Wenn alles, was Sie tun wollen, ist nur fangen die offensichtlichsten Syntaxfehler, würde ich etwas wie dieses tun:

^\S+@\S+$

Sie fängt in der Regel die offensichtlichsten Fehler ab, die der Benutzer macht, und stellt sicher, dass das Formular größtenteils richtig ist, worauf es bei der JavaScript-Validierung ankommt.

EDIT: Wir können auch nach '.' in der E-Mail suchen, indem wir

/^\S+@\S+\.\S+$/

120 Stimmen

+1 wie das Senden von E-Mail und sehen, was passiert, ist der einzige wirklich sichere Weg, um eine E-Mail-Adresse zu validieren, theres keine Notwendigkeit, mehr als eine einfache Regex-Match zu tun.

4 Stimmen

Aber es akzeptiert "Mohit Atray"@gmail.com nicht, weil es ein Leerzeichen enthält. Vielleicht sollten wir einfach /^ verwenden \S. *@ \S +$/ regex.

0 Stimmen

Dies ist die beste Antwort

376voto

Paolo Bergantino Punkte 465120

Es gibt etwas, das Sie verstehen müssen, sobald Sie sich entscheiden, einen regulären Ausdruck zur Validierung von E-Mails zu verwenden: Das ist wahrscheinlich keine gute Idee. . Wenn Sie sich damit abgefunden haben, gibt es viele Implementierungen, die Sie auf halbem Weg dorthin bringen können, Dieser Artikel fasst sie sehr gut zusammen.

Kurz gesagt, die einzige Möglichkeit, absolut sicher zu sein, dass das, was der Benutzer eingegeben hat, tatsächlich eine E-Mail ist, besteht darin, tatsächlich eine E-Mail zu senden und zu sehen, was passiert. Ansonsten ist alles nur eine Vermutung.

77 Stimmen

@kommradHomer -- eine "regex ungültige" Adresse ist fast immer gültig, weil der Regex, den Sie zur Validierung einer E-Mail-Adresse verwenden, mit ziemlicher Sicherheit falsch ist und gültige E-Mail-Adressen ausschließt. Eine E-Mail-Adresse ist name_part@domain_part und praktisch alles, einschließlich eine @ ist im name_part gültig; Die Adresse foo@bar@machine.subdomain.example.museum ist legal, obwohl es als "escaped" werden muss foo\@bar@machine.... . Sobald die E-Mail die Domäne erreicht, z. B. "example.com", kann diese Domäne die E-Mail "lokal" weiterleiten, so dass "seltsame" Benutzernamen und Hostnamen existieren können.

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