Ich habe diese Funktion, um eine E-Mail-Adresse zu validieren:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
Ist dies in Ordnung, um zu überprüfen, ob die E-Mail-Adresse gültig ist oder nicht?
php
regex
email
email-validation
Cameron
quelle
quelle
validateEmail
wäre Corret, sowie vorbei$email
, nicht$EMAIL
.Antworten:
Der einfachste und sicherste Weg, um zu überprüfen, ob eine E-Mail-Adresse korrekt ist, ist die Verwendung der folgenden
filter_var()
Funktion:Zusätzlich können Sie überprüfen, ob die Domain einen
MX
Datensatz definiert :Dies garantiert jedoch immer noch nicht, dass die E-Mail vorhanden ist. Der einzige Weg, dies herauszufinden, ist das Senden einer Bestätigungsmail.
Nachdem Sie Ihre einfache Antwort erhalten haben, können Sie sich gerne über die Validierung von E-Mail-Adressen informieren, wenn Sie etwas lernen oder auf andere Weise einfach die schnelle Antwort verwenden und fortfahren möchten. Keine harten Gefühle.
Der Versuch, eine E-Mail-Adresse mit einem regulären Ausdruck zu überprüfen, ist eine "unmögliche" Aufgabe. Ich würde sogar sagen, dass der von Ihnen erstellte Regex nutzlos ist. Es gibt drei RFCs in Bezug auf E-Mail-Adressen und das Schreiben eines regulären Ausdrucks, um falsche E-Mail-Adressen abzufangen und gleichzeitig keine falschen Positiven zu haben, ist etwas, was kein Sterblicher tun kann. In dieser Liste finden Sie Tests (sowohl fehlgeschlagen als auch erfolgreich) des von der PHP-
filter_var()
Funktion verwendeten regulären Ausdrucks .Selbst die integrierten PHP-Funktionen, E-Mail-Clients oder Server machen es nicht richtig. Trotzdem ist in den meisten Fällen
filter_var
die beste Option.Wenn Sie wissen möchten, welches Regex-Muster PHP (derzeit) zur Überprüfung von E-Mail-Adressen verwendet, lesen Sie die PHP-Quelle .
Wenn Sie mehr über E-Mail-Adressen erfahren möchten, empfehle ich Ihnen, mit dem Lesen der technischen Daten zu beginnen, aber ich muss Sie warnen, dass dies in keiner Weise einfach zu lesen ist:
Beachten Sie, dass dies
filter_var()
wie bereits erwähnt nur ab PHP 5.2 verfügbar ist. Wenn Sie möchten, dass es mit früheren Versionen von PHP funktioniert, können Sie den in PHP verwendeten regulären Ausdruck verwenden:PS Ein Hinweis zum oben verwendeten Regex-Muster (von der PHP-Quelle). Es sieht so aus, als ob Michael Rushton ein Urheberrecht daran hat . Wie bereits erwähnt: "Sie können diesen Code gerne verwenden und weitergeben. Bitte bewahren Sie diesen Copyright-Hinweis auf."
quelle
filter_var
wird einige Zeit zurückbleiben, selbst wenn sie sich gerade ändern (ich habe einen Fehlerbericht veröffentlicht).Hierfür können Sie filter_var verwenden .
quelle
Nach meiner Erfahrung haben
regex
Lösungen zu viele falsch positive undfilter_var()
Lösungen falsch negative (insbesondere bei allen neueren TLDs ).Stellen Sie stattdessen sicher, dass die Adresse alle erforderlichen Teile einer E-Mail-Adresse enthält (Benutzer, "@" - Symbol und Domäne), und überprüfen Sie dann, ob die Domäne selbst vorhanden ist.
Es gibt keine Möglichkeit (serverseitig) festzustellen, ob ein E-Mail-Benutzer für eine externe Domäne vorhanden ist.
Dies ist eine Methode, die ich in einer Utility-Klasse erstellt habe:
quelle
stristr
Die Domain wird nicht abgerufen, wenn mehrere @ -Zeichen vorhanden sind. Besserexplode('@',$email)
und überprüfen Sie dassizeof($array)==2
checkdnsrr()
wie false, wenn in der Domain ein @ -Zeichen vorhanden wäre.Ich denke, Sie sind möglicherweise besser dran, wenn Sie die in PHP integrierten Filter verwenden - in diesem speziellen Fall:
Es kann ein wahr oder falsch zurückgeben, wenn es mit dem
FILTER_VALIDATE_EMAIL
Parameter geliefert wird.quelle
Dadurch wird Ihre E-Mail nicht nur validiert, sondern auch auf unerwartete Zeichen überprüft:
quelle
Beantwortete dies in der 'Top-Frage' zur E-Mail-Überprüfung https://stackoverflow.com/a/41129750/1848217
Überprüfen Sie einfach @, geben Sie dem Benutzer im Frontend einen Hinweis und senden Sie Bestätigungs-E-Mails an die angegebene Adresse.
quelle
@
sie jedoch für einen der RFCs, die E-Mails regeln, gültig ist. Es funktioniert auch nicht wie geschrieben. Ich habe es über regex101.com ausgeführt und es konnte keine gültigen Adressen gefunden werden/^[^@]+@[^@+]$/
zu/^[^@]+@[^@]+$/
filter_var
Methode? Es behebt auch nicht das Problem, dass schlecht formatierte Adressen akzeptiert werden. Ihre Regex wird gernejoe@domain
als gültige E-Mail-Adresse akzeptiert , wenn dies nicht derfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
. Sie haben jedoch eine alte Funktion auf dem Server und können in einigen Fällen nicht aktualisiert werden. Und Sie verlieren Kunden mit einigen neuen gültigen E-Mails. Außerdem stelle ich erneut fest, dass nicht alle E-Mail-Server streng nach dem üblichen und modernen Standard von E-Mail-Adressen funktionieren.Wenn Sie überprüfen möchten, ob die von der E-Mail-Adresse angegebene Domain gültig ist, verwenden Sie Folgendes:
Dies ist eine praktische Möglichkeit, viele ungültige E-Mail-Adressen zusammen mit der Standard-E-Mail-Validierung zu filtern, da ein gültiges E-Mail-Format keine gültige E-Mail bedeutet .
Beachten Sie, dass die Funktion
idn_to_ascii()
(oder seine Schwesterfunktionidn_to_utf8()
) in Ihrer PHP-Installation möglicherweise nicht verfügbar ist. Sie erfordert die Erweiterungen PECL intl> = 1.0.2 und PECL idn> = 0.1.Beachten Sie auch, dass IPv4 oder IPv6 als Domain-Teil in E-Mails (zum Beispiel
user@[IPv6:2001:db8::1]
) nicht validiert werden können, sondern nur benannte Hosts.Sehen Sie hier mehr .
quelle
Nachdem ich die Antworten hier gelesen hatte, kam ich zu folgendem Ergebnis:
quelle
Wenn Sie nur nach einem tatsächlichen regulären Ausdruck suchen, der verschiedene Punkte, Unterstriche und Striche zulässt, gehen Sie wie folgt vor :
[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Dadurch kann eine ziemlich dumm aussehende E-Mailtom_anderson.1-neo@my-mail_matrix.com
validiert werden.quelle
Wenn Sie heutzutage ein HTML5-Formular mit verwenden, sind
type=email
Sie bereits zu 80% sicher, da Browser-Engines über einen eigenen Validator verfügen. Um dies zu ergänzen, fügen Sie diesen regulären Ausdruck zu Ihrem hinzupreg_match_all()
und negieren Sie ihn:Suchen Sie den regulären Ausdruck, der von HTML5-Formularen zur Validierung verwendet wird:
https://regex101.com/r/mPEKmy/1
quelle