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.

6voto

auco Punkte 9012

Ich weiß, dass es in dieser Frage um reguläre Ausdrücke geht, aber ich schätze, dass 90 % aller Entwickler, die diese Lösungen lesen, versuchen, eine E-Mail-Adresse in einem HTML-Formular zu validieren, das in einem Browser angezeigt wird.

Wenn dies der Fall ist, würde ich vorschlagen, die neue HTML5 <input type="email"> Formular-Element:

HTML5:

 <input type="email" required />

CSS 3:

 input:required {
      background-color: rgba(255, 0, 0, 0.2);
 }

 input:focus:invalid {
     box-shadow: 0 0 1em red;
     border-color: red;
 }

 input:focus:valid {
     box-shadow: 0 0 1em green;
     border-color: green;
 }

Es ist bei HTML5-Formularvalidierung ohne JS - JSFiddle - Code Playground .

Dies hat mehrere Vorteile:

  1. Automatische Validierung und keine kundenspezifische Lösung erforderlich: einfach und leicht zu implementieren
  2. Kein JavaScript, und keine Probleme, wenn JavaScript deaktiviert ist
  3. Kein Server muss dafür etwas berechnen
  4. Der Benutzer erhält sofortiges Feedback
  5. Alte Browser sollten automatisch auf den Eingabetyp "Text" zurückgreifen.
  6. Mobile Browser können eine spezielle Tastatur anzeigen (@-Keyboard)
  7. Feedback zur Formularvalidierung ist mit CSS 3 sehr einfach

Der offensichtliche Nachteil könnte die fehlende Validierung für alte Browser sein, aber das wird sich mit der Zeit ändern. Ich würde dies einem dieser verrückten Meisterwerke der regulären Ausdrücke vorziehen.

Siehe auch:

0 Stimmen

Der andere Nachteil ist, dass dies nur auf der Client-Seite geschieht. Gut für die Bereitstellung einer reibungslosen Benutzererfahrung, schlecht für die Validierung von Daten.

0 Stimmen

Das Problem mit der Standard-E-Mail-Prüfung ist, dass sie viele falsch-positive Ergebnisse . Sie müssen Folgendes verwenden mein komplettes Muster um alle falsch-positiven Ergebnisse zu eliminieren und gleichzeitig zu verhindern, dass sich falsch-negative Ergebnisse einschleichen. Dieses Muster kann hinzugefügt werden über die pattern Attribut . Siehe meine Stelle für weitere Informationen.

5voto

grosser Punkte 14107

Diese Regel entspricht dem, was unsere Postfix Server konnte nicht senden an.

Erlaubt sind Buchstaben, Zahlen, -, _, +, ., &, /, und !

Nein -foo@bar.com

Nein asd@-bar.com

/^([a-z0-9\+\._\/&!][-a-z0-9\+\._\/&!]*)@(([a-z0-9][-a-z0-9]*\.)([-a-z0-9]+\.)*[a-z]{2,})$/i

5voto

Ondřej Šotek Punkte 1711

Für PHP verwende ich der E-Mail-Adressvalidator aus dem Nette Framework :

/* public static */ function isEmail($value)
{
    $atom = "[-a-z0-9!#$%&'*+/=?^_`{|}~]"; // RFC 5322 unquoted characters in local-part
    $localPart = "(?:\"(?:[ !\\x23-\\x5B\\x5D-\\x7E]*|\\\\[ -~])+\"|$atom+(?:\\.$atom+)*)"; // Quoted or unquoted
    $alpha = "a-z\x80-\xFF"; // Superset of IDN
    $domain = "[0-9$alpha](?:[-0-9$alpha]{0,61}[0-9$alpha])?"; // RFC 1034 one domain component
    $topDomain = "[$alpha](?:[-0-9$alpha]{0,17}[$alpha])?";
    return (bool) preg_match("(^$localPart@(?:$domain\\.)+$topDomain\\z)i", $value);
}

5voto

FlameStorm Punkte 884

Für mich ist der richtige Weg, um E-Mail-Adressen zu überprüfen:

  1. Prüfen Sie, ob das Symbol @ vorhanden ist und ob sich vor und nach diesem Symbol andere Symbole als @ befinden: /^[^@]+@[^@]+$/
  2. Versuchen Sie, eine E-Mail mit einem "Aktivierungscode" an diese Adresse zu senden.
  3. Wenn der Benutzer seine E-Mail-Adresse "aktiviert" hat, werden wir sehen, dass alles in Ordnung ist.

Natürlich können Sie im Frontend eine Warnung oder einen Tooltip anzeigen, wenn der Benutzer eine "seltsame" E-Mail eingegeben hat, um ihm zu helfen, häufige Fehler zu vermeiden, z. B. keinen Punkt im Domänenteil oder Leerzeichen im Namen ohne Anführungszeichen usw. Aber Sie müssen die Adresse "hello@world" akzeptieren, wenn der Benutzer sie wirklich will.

Sie müssen auch bedenken, dass sich der Standard für E-Mail-Adressen weiterentwickelt hat und weiterentwickeln kann, so dass Sie nicht einfach eine "standardgültige" Regexp ein für alle Mal eingeben können. Und Sie müssen bedenken, dass einige konkrete Internetserver einige Details des allgemeinen Standards nicht einhalten können und tatsächlich mit einem eigenen "modifizierten Standard" arbeiten.

Überprüfen Sie also einfach @, weisen Sie den Benutzer im Frontend darauf hin und senden Sie Verifizierungs-E-Mails an die angegebene Adresse.

4voto

Asad Ali Choudhry Punkte 4419

Obwohl bereits sehr ausführliche Antworten hinzugefügt wurden, denke ich, dass diese komplex genug für einen Entwickler sind, der nur nach einer einfachen Methode sucht, um eine E-Mail-Adresse zu validieren oder alle E-Mail-Adressen aus einem String in Java zu erhalten.

public static boolean isEmailValid(@NonNull String email) {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

Was den regulären Ausdruck betrifft, so verwende ich immer diesen regulären Ausdruck, der bei meinen Problemen funktioniert.

"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}"

Wenn Sie alle E-Mail-Adressen in einer Zeichenkette finden möchten, indem Sie den regulären Ausdruck E-Mail verwenden. Sie können eine Methode finden unter dieser Link .

0 Stimmen

Re "was bei meinen Problemen funktioniert". : Welche Probleme könnten das sein? Was sind einige Beispiele für falsch positive und falsch negative Ergebnisse? Wie gehen Sie damit um?

0 Stimmen

Welche Programmiersprache? Java ? Dies war Kommentar Nummer 2 und Frage Nummer 2.

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