RegEx für email Adresse (Name mit Bindestrich und Punkt)
WernerK
- php
0 Gunnar Bittersmann0 Der Martin
0 Cheatah0 Alexander (HH)
Hallo,
ich hatte bisher folgende regexe zum prüfen einer email adresse:
$email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);
Dieses scheitert aber wenn der Name wie folgt ist, also mit Bindestrich im Vornamen getrennt von einem Punkt mit Nachname.
hans-peter.meier@meineadresse.de
Ich komme nicht drauf wie man das anpassen muss.
Hat jemand eine Idee?
vielen Dank
WernerK
@@WernerK:
nuqneH
ich hatte bisher folgende regexe zum prüfen einer email adresse: […]
Hat jemand eine Idee?
Ja: .+@.+..+ Alles andere ist Unsinn.
BTW, PHP bietet Validierungsfilter. Der für E-Mail-Adressen arbeitet falsch.
Qapla'
Hallo,
Ja: .+@.+..+ Alles andere ist Unsinn.
auch nur bedingt einsetzbar: root@localhost fällt durch.
Sollte man überhaupt mehr als .+@.+ verlangen?
Ciao,
Martin
[latex]Mae govannen![/latex]
Ja: .+@.+..+ Alles andere ist Unsinn.
auch nur bedingt einsetzbar: root@localhost fällt durch.
Solche Adressen sind nur für Applikationen in internen Netzen interessant, im Web funktionieren sie ohnehin nicht. Insofern ist es meist irrelevant, wenn sie blockiert werden.
Solange der OP nicht explizit ein internes Netzwerk (--> Tipps für Fragende) erwähnt… :)
Stur lächeln und winken, Männer!
Kai
Hallo,
vielen Dank für die Tipps und Ratschläge.
Sollte man überhaupt mehr als .+@.+ verlangen?
Mir ist klar das eine umfangreiche email Adress Validierung vermutlich sehr schwierig ist bzw. so einfach garnicht machbar ist. Zumal wenn dann noch französische oder spanische Namen dazukommen.
danke nochmals
Gruss
Werner
Ich muss doch nochmals nachfragen,
ich habe mal eure Links und Tipps vom Forum hier ausprobiert.
Selbst wenn ich eine ganz einfache Prüfung mache:
/^.+@.+..+$/i
Dann wird die Adresse:
hans-peter.meier@muster.de
nicht erlaubt.
Mir ist nicht ganz klar warum. Wenn ich es richtig verstehe bedeutet doch;
.+@
beliebige Zeichen, einmal oder mehrmals vor dem @ Zeichen?
Nach dem @ Zeichen nochmals mit .+ beliebige Zeichen bis zum Punkt.
Warum wird die obige Adresse trotzdem blockiert?
Danke
Gruss
Werner
Hi,
/^.+@.+..+$/i
Dann wird die Adresse:
hans-peter.meier@muster.de
nicht erlaubt.
Der Regex matcht. Du machst also irgendwas anderes falsch. Wie wertest Du das denn aus?
Steht im zu testenden String wirklich nur die E-Mail-Adresse? Oder vielleicht doch noch ein Zeilenumbruch?
cu,
Andreas
Hallo,
also ich mach das so:
define (EMAIL, "/^.+@.+..+$/i");
...
if(strlen($_POST['email']) >= 0 and !preg_match(EMAIL, $_POST['email'])){
echo "Email falsche Syntax"
}
Nach Eingabe von der Adresse
hans-peter.meier@test.de
und dem Submit kommt ständig "Email falsche Syntax".
Sobald ich den Bindestrich weglasse, match der Regex
komisch oder?
gruss
Werner
Hi,
define (EMAIL, "/^.+@.+..+$/i");
achte auf die besondere Bedeutung des Backslashes in double-quoted Strings! Kann sein, dass die Sequenz . hier tatsächlich als Backslash und ein Punkt aufgelöst wird, weil die Kombination . keine Sonderbedeutung in einem PHP-String hat. Korrekt ist es aber nicht.
if(strlen($_POST['email']) >= 0 and !preg_match(EMAIL, $_POST['email'])){
echo "Email falsche Syntax"
}
Was willst du mit strlen()>=0 herausfinden? Nichts, denn strlen() liefert *immer* einen Wert größer oder gleich 0. Vermutlich meintest du hier ein einfaches "größer". Besser wäre dafür aber die Abfrage if (!empty($_POST['email']) ...), denn die hat den zusätzlichen Charme, dass sie keine Fehlermeldung (Notice) produziert, wenn $_POST['email'] nicht existiert.
Und vermutlich meintest du hier ein logisches ODER, kein UND. Denn wenn ich einen Leerstring übergebe, ist schon die korrigierte erste Bedingung strlen()>0 nicht erfüllt, die zweite wird gar nicht mehr ausgewertet.
hans-peter.meier@test.de
Bitte verwende für Beispiele entweder deine eigene Domain, oder eine der dafür vorgesehenen. Die Stiftung Warentest besitzt vermutlich eine der am häufigsten missbrauchten Domains und wird darüber nicht begeistert sein.
Sobald ich den Bindestrich weglasse, match der Regex
Hast du dir mal den in $_POST['email'] übergebenen String angesehen? Ich wüsste zwar nicht, warum - aber vielleicht spielt da noch irgendeine seltsame Maskierung mit rein.
komisch oder?
Ja, sehr.
Ciao,
Martin
Hallo,
jetzt habe ich es zum Testen mal geändert:
define (EMAIL, '/^.+@.+..+$/i');
if(!preg_match(EMAIL, $_POST['email'])){
echo "Die email ist -" .$_POST['email']. "- <br>";
echo "Email falsche Syntax"
}
trotzdem funktioniert es nur wenn ich den Bindestrich im Vornamen rausnehme
Die Echo Kontroller zeigt aber den Namen richtig an, also ohne Umbruch.
Die email ist -hans-peter.meier@example.com-
ich glaub ich gebs auf.
Gruss
Werner
[latex]Mae govannen![/latex]
jetzt habe ich es zum Testen mal geändert:
define (EMAIL, '/^.+@.+..+$/i');
if(!preg_match(EMAIL, $_POST['email'])){echo "Die email ist -" .$_POST['email']. "- <br>";
echo "Email falsche Syntax"
}trotzdem funktioniert es nur wenn ich den Bindestrich im Vornamen rausnehme
Die Echo Kontroller zeigt aber den Namen richtig an, also ohne Umbruch.Die email ist -hans-peter.meier@example.com-
ich glaub ich gebs auf.
Du machst auf deinem System etwas anders als du es uns hier erzählst. Jedenfalls würde obiger Code oder der Code aus https://forum.selfhtml.org/?t=208022&m=1414553 so gar nicht laufen, weil er einen Syntax-Fehler enthält (und außerdem noch eine Warnung wirft). Wenn man diese Fehler behebt, funktioniert obiger Code hier jedenfalls mit der von dir gewünschten Adresse einwandfrei.
Schlussfolgerung: Dein verwendeter Code muß also anders sein als der hier gepostete.
Stur lächeln und winken, Männer!
Kai
Also wenn du auf das fehlende Semikolon bei der Echo Ausgabe ansprichts,
dann war das ein Fehler hier beim posten.
define (EMAIL, '/^.+@.+..+$/i');
if(!preg_match(EMAIL, $_POST['email'])){
echo "Falsche Email Adresse";
}
so gibt es bei mir keinen Syntax Error
Ich weiss trotzdem nicht warum das Regex bei mir nicht greift.
Gruss
Werner
Was mir noch einfällt.
Könnte es daran liegen das ich die ganze PHP Seite in UTF-8 ausliefere?
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Gruss
Werner
Hallo,
Könnte es daran liegen das ich die ganze PHP Seite in UTF-8 ausliefere?
nein, nicht bei den Beispielen, die du genannt hast. Sowohl dein RegEx, als auch die Mailadresse, die du zum Testen verwendet hast, besteht ausschließlich aus ASCII-Zeichen; die sehen auch in der UTF-8-Codierung Bit für Bit exakt gleich aus.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Ist dir bewusst, dass diese Angabe vermutlich nur Zierde ist? Sie dient nur als Ersatzangabe für den Fall, dass der Server keine Angabe zur Zeichencodierung macht (oder das Dokument nicht per HTTP übertragen wird). Sobald aber der Server im HTTP-Header eine andere Angabe macht, hat die Vorrang.
Ciao,
Martin
Hi,
Ja: .+@.+..+ Alles andere ist Unsinn.
auch nur bedingt einsetzbar: root@localhost fällt durch.
Sollte man überhaupt mehr als .+@.+ verlangen?
Im Normalfall will man keine lokalen Adressen haben, also ja - die Prüfung auf mindestens einen Punkt im Domainpart ist in den meisten Fällen sinnvoll.
Als weitergehende Prüfung der Domain würde ich aber nicht syntaktische Prüfung machen, sondern eher eine DNS-Anfrage, um die Existenz der Domain zu überprüfen. Und ggf. auch gucken, ob ein MX-Record existiert.
cu,
Andreas
Tach,
Als weitergehende Prüfung der Domain würde ich aber nicht syntaktische Prüfung machen, sondern eher eine DNS-Anfrage, um die Existenz der Domain zu überprüfen. Und ggf. auch gucken, ob ein MX-Record existiert.
ein MX-Record ist zum Empfang von Mails nicht nötig, ein A-Record reicht.
mfg
Woodfighter
Hi,
ich hatte bisher folgende regexe zum prüfen einer email adresse:
schade eigentlich.
$email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);
a@example.com wird abgelehnt.
a|||@example.com wird durchgelassen.
a.@example.com wird durchgelassen.
a..b@example.com wird durchgelassen.
abc@example.museum wird abgelehnt.
Ich komme nicht drauf wie man das anpassen muss.
Und Deine Suche nach Überprüfung von E-Mail-Adressen war nicht erfolgreich? Weder im Netz, noch hier im Forumsarchiv?
Cheatah
Hi,
$email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);
a|||@example.com wird durchgelassen.
warum auch nicht?
das Pipe-Zeichen ist im localpart an genau den Stellen zulässig, an denen auch ein Buchstabe, eine Ziffer, ein Minuszeichen (und noch einige andere) zulässig sind.
auch |||.---.|||@example.com ist formal zulässig. Man kann also Morse-Code als E-Mail-Adressen-Localpart haben (mit | für Kurz, - für Lang, und . für Zeichentrenner)
cu,
Andreas
Hi,
$email_flag=preg_match("!^\w[\w|.|-]+@\w[\w|.|-]+.[a-zA-Z]{2,4}$!",$email);
a|||@example.com wird durchgelassen.
warum auch nicht?
warum fragst Du?
Aufgrund der doppelten Nennung des Zeichens, das an einer anderen Stelle der RegExp auch noch die Bedeutung "oder" hätte, gehe ich davon aus, dass der OP dieses Ergebnis nicht erwartet hätte.
auch |||.---.|||@example.com ist formal zulässig. Man kann also Morse-Code als E-Mail-Adressen-Localpart haben (mit | für Kurz, - für Lang, und . für Zeichentrenner)
Mit speziell diesem Localpart der E-Mail-Adresse solltest Du sparsam umgehen. Es gibt genügend Leute, die nicht wissen, dass das als "SOS" bezeichnete Notsignal aus nur einem einzigen Zeichen besteht, und somit trotz der Zeichentrenner diese Adresse als Notrufempfänger oder -absender fehlinterpretieren könnten ;-)
Cheatah
Moin Moin!
Siehe auch Validierung von eMail-Adressen (Selfforumssieb).
Alexander