Schönheitsfehler in isValidMail()

David S
Beiträge: 14
Registriert: Mi 2. Nov 2005, 21:03
Kontaktdaten:

Schönheitsfehler in isValidMail()

Beitrag von David S »

In der Funktion isValidMail in der functions.general.php fehlt ein \ vor dem Punkt, damit dieser auch als Punkt interpretiert wird.

Die Zeile muss also richtig lauten:

Code: Alles auswählen

return preg_match("/^[0-9a-z]([-_.]*[0-9a-z]*)*@[a-z0-9-]+\.([a-z])/i", $email);
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 »

verschoben
holger.librenz_4fb

Beitrag von holger.librenz_4fb »

Ähm, hat die Funktion mal jemand genauer getestet?

Wenn ich es richtig sehe funktioniert die Prüfung sowieso nicht, denn nach dem Punkt müssen doch minimum 2 und können maximum 4 Zeichen stehen?!
Außerdem werden in der Funktion Umlautdomains nicht unterstützt.

Mein Vorschlag wäre die RegExp wie folgt zu ändern:

Code: Alles auswählen

/^[\w\d+-]+@[\w\d-]+\.[A-Z]{2,4}$/i
So long...
Holger
delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Beitrag von delinquent »

Bei beiden Versionen stimmt was nicht.

Z.B. wird @irgendwas.co.uk weder in Variante 1 noch in Variante 2 akzeptiert.

Oder hab ich gerade nen Knick in der Optik?
calvini
Beiträge: 95
Registriert: Mo 21. Feb 2005, 12:06
Kontaktdaten:

Beitrag von calvini »

delinquent hat geschrieben:Z.B. wird @irgendwas.co.uk weder in Variante 1 noch in Variante 2 akzeptiert.
Falls vor dem @ noch etwas steht, wird es auch akzeptiert - habe mich dabei nicht nur auf den Augenschein verlassen, sondern es ausprobiert - du auch?

Wenn man der wikipedia glauben kann, ist da noch einiges im Argen. Ich nehme mich dessen mal an ...
calvini
Beiträge: 95
Registriert: Mo 21. Feb 2005, 12:06
Kontaktdaten:

Beitrag von calvini »

Das hier

Code: Alles auswählen

$lp_char = '-A-Za-z0-9!#$%&\'*+\\/=?^_`{|}~';
$lp_rexp = '(['.$lp_char.']|['.$lp_char.']['.$lp_char.'.]*['.$lp_char.'])';
$dp_char = 'A-Za-z';
$dp_rexp = '((['.$dp_char.']|['.$dp_char.']['.$dp_char.'0-9-]{0,61}['.$dp_char.'0-9])\\.)+['.$dp_char.']{2,}';
preg_match('/^'.$lp_rexp.'@'.$dp_rexp.'$/',$email);
sollte es ungefähr treffen.

Hier eine versuchte umgangssprachliche Erklärung:

$lp_rexp: Der local-part (vor dem @) ist mindestens ein Zeichen lang und darf nur die in $lp_char angegebenen Zeichen (und den Punkt) enthalten, aber weder mit einem Punkt beginnen noch damit enden.

$dp_rexp: Der domain-part (nach dem @) besteht aus einzelnen, mindestens ein Zeichen und maximal 63 Zeichen langen, durch Punkte getrennten Fragmenten, wobei jedes Fragment mit einem Buchstaben beginnen muss und nicht mit einem Bindestrich enden darf, und ansonsten nur aus Buchstaben, Zahlen und dem Bindestrich bestehen darf. Das letzte Fragment (Top-Level-Domain, TLD) besteht nur aus (mindestens 2) Buchstaben. Die erlaubte Maximallänge von 255 Zeichen für den domain-part wird von obigem Code nicht geprüft, ich wüsste jetzt auch nicht, wie das (über einen regulären Ausdruck) umgesetzt werden könnte. Falls gewünscht, können die für internationale Domains mittlerweile erlaubten Sonderzeichen zusätzlich in $dp_char eingetragen werden (siehe auch wikipedia). Da diese aber wieder TLD-Abhängig sind, dürfte das nicht ganz so trivial sein.

@kronk2002de: Soweit ich das sehe, ist \d in \w bereits enthalten und \w enthält zudem den für Domainnamen nicht erlaubten Unterstrich. TLDs dürfen auch länger als 4 Zeichen sein (siehe z. B. (mal wieder) die wikipedia).

Über qualifizierte Kommentare und ggf. Verbesserungsvorschläge freue ich mich jederzeit. Zum Beispiel konnte ich nicht verifizieren, ob als erstes Zeichen eines Fragmentes im domain-part auch die Sonderzeichen erlaubt sind oder nur A-Z. Ebenfalls unklar ist mir, ob für TLDs Sonderzeichen und ggf. auch Zahlen und der Bindestrich erlaubt sind.
Zuletzt geändert von calvini am Do 20. Sep 2007, 13:03, insgesamt 1-mal geändert.
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

versucht es mal mit dem regex

Code: Alles auswählen

/^(([a-z0-9äöüß]([\-_\.]*[a-z0-9äöüß])*)+@(([a-z0-9äöüß]([\-_\.]*[a-z0-9äöüß])*)+\.)+[a-z]{2,9})*$/i
calvini
Beiträge: 95
Registriert: Mo 21. Feb 2005, 12:06
Kontaktdaten:

Beitrag von calvini »

Brazo Alkher hat geschrieben:versucht es mal mit dem regex

Code: Alles auswählen

/^(([a-z0-9äöüß]([\-_\.]*[a-z0-9äöüß])*)+@(([a-z0-9äöüß]([\-_\.]*[a-z0-9äöüß])*)+\.)+[a-z]{2,9})*$/i
Meines Wissens dürfen im local-part keine Sonderzeichen vorkommen - falls doch, würde ich mich über eine Quellenangabe freuen (meine Quelle: RFC 2822).
calvini
Beiträge: 95
Registriert: Mo 21. Feb 2005, 12:06
Kontaktdaten:

Beitrag von calvini »

Und der Vollständigkeit halber noch der RFC für die Domain-Namen: RFC 1035.
delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Beitrag von delinquent »

calvini hat geschrieben:Das hier

Code: Alles auswählen

$lp_char = '-A-Za-z0-9!#$%&\'*+\\/=?^_`{|}~';
$lp_rexp = '(['.$lp_char.']|['.$lp_char.']['.$lp_char.'.]*['.$lp_char.'])';
$dp_char = 'A-Za-z';
$dp_rexp = '((['.$dp_char.']|['.$dp_char.']['.$dp_char.'0-9-]{0,61}['.$dp_char.'0-9])\\.)+['.$dp_char.']{2,}';
preg_match('/^'.$lp_rexp.'@'.$dp_rexp.'$/',$email);
sollte es ungefähr treffen.
%@dot.com ist ne gültige Adresse?! Da ist die Variante von Brazo meines Erachtens nach eleganter, wobei ich mir nicht sicher bin, ob nicht auch das letzte Zeichen vor dem @ eines der [.-_] sein darf. Wie auch immer, um die RFCs zu wälzen ists mir heute zu spät...

Ich wünsch Euch was.
calvini
Beiträge: 95
Registriert: Mo 21. Feb 2005, 12:06
Kontaktdaten:

Beitrag von calvini »

delinquent hat geschrieben:Da ist die Variante von Brazo meines Erachtens nach eleganter
[ironic-mode]
Eleganz in allen Ehren, aber geht es hier um Eleganz oder um Korrektheit :roll:? Und hieße das dann, dass z. B. "ä@0_0.aaä@0_0.aa" eine elegante E-Mail-Adresse ist, weil preg_match() mit Brazos RegExp als Ergebnis 1 zurückliefert? Aber ist sie deshalb auch korrekt?
[/ironic-mode]

Um mich der Eleganz aber nicht ganz zu verschließen, gestehe ich ein, dass sich

Code: Alles auswählen

$lp_rexp = '(['.$lp_char.']|['.$lp_char.']['.$lp_char.'.]*['.$lp_char.'])'; 
wohl etwas eleganter auch als

Code: Alles auswählen

$lp_rexp = '['.$lp_char.'](\\.*['.$lp_char.'])*'; 
darstellen lässt.

Mithin ergäbe sich

Code: Alles auswählen

$lp_char = '-A-Za-z0-9!#$%&\'*+\\/=?^_`{|}~';
$lp_rexp = '['.$lp_char.'](\\.*['.$lp_char.'])*'; 
$dp_char = 'A-Za-z';
$dp_rexp = '((['.$dp_char.']|['.$dp_char.']['.$dp_char.'0-9-]{0,61}['.$dp_char.'0-9])\\.)+['.$dp_char.']{2,}';
preg_match('/^'.$lp_rexp.'@'.$dp_rexp.'$/',$email);
[serious-mode]
Falls es hier allerdings tatsächlich belächelt wird, wenn sich jemand etwas ausführlicher mit einer Sache beschäftigt und eine überprüfte Lösung für ein Problem inklusive Quellenangaben präsentiert, wohingegen Lösungen, die einer ernsthaften Prüfung nicht standhalten, vorbehaltlos akzeptiert werden, dann bitte ich, mir dies mitzuteilen. In diesem Fall würde ich mir nämlich ziemlich vera....t vorkommen und mir überlegen, ob es für mich sinnvoll ist, zu versuchen, an der Verbesserung von Contenido mitzuwirken.
[/serious-mode]
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

@calvini: Ich habe lediglich den regex, den ich vor Monaten mir mal zusammengeschrieben hatte und der E-Mails nach meinem Kenntnissstand korrekt matcht, hier gepostet.
Ich wollte dich sicherlich nicht kritisieren :-)

Ich bin ja auch dafür Contenido besser zu machen und Fehler zu bereinigen (auch wenn diese sporadisch von vielen als nicht existent abgetan worden sind)
delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Beitrag von delinquent »

Ich hatte nicht vor, irgendwen anzugreifen oder jemandem meine Ansichten aufzuzwingen. Meine Beiträge spiegeln lediglich meine bescheidene Meinung wider. Und meiner Meinung nach, war Dein Regex genauso wenig fehlerfrei wie irgendein anderer der hier genannten.

Wir sind alle hier, um Fehler zu beseitigen. Einige hier haben aber (weil Ehrenamtlich) nicht die Zeit sich um alles 100%ig Gedanken zu machen. Mir ist der eine Fehler halt aufgefallen, der andere nicht. Wenn Du calvini allerdings die Zeit und Lust hast, den perfekten regulären Ausdruck nach allen Regeln der RFCs zu entwickeln, steht es Dir meinetwegen auch frei fleißig endliche Automaten zu malen und die nachher in einen gültigen Ausdruck zu überführen. Damit ist dann ein weiterer Fehler ausgemerzt.

Da ich persönlich nicht die Zeit habe, werde ich mich mit den derzeitigen Korrekturen zufrieden geben und weiterhin meinen Teil zur Entwicklung beitragen.
calvini
Beiträge: 95
Registriert: Mo 21. Feb 2005, 12:06
Kontaktdaten:

Beitrag von calvini »

@delinquent: %@dot.com ist nach meiner Interpretation der RFC eine gültige E-Mail-Adresse. Du schreibst sinngemäß, dass du keine Lust hast, die RFCs zu wälzen und behauptest deshalb einfach aus dem Bauch heraus, sie wäre falsch (sollte ich deine Angabe zur Begründung übersehen haben, weise mich bitte noch einmal darauf hin). Und bei einer solchen Behandlung und solchen Anmerkungen wie "steht es Dir meinetwegen auch frei fleißig endliche Automaten zu malen" vergeht mir die Lust. Mag sein, dass das dein normaler Umgangston ist, meiner ist es nicht. Ich kriege für meine Beteiligung hier auch kein Geld, höchstens manchmal ziemlich dumme Kommentare.

@Brazo: Habe mich von dir nicht kritisiert gefühlt. Mich ärgert lediglich das undifferenzierte Herunterputzen anderer. Woher hast du die Basis für deine RegExp? Sonderzeichen im local-part sind nach meinem Kenntnisstand nicht erlaubt, gleiches gilt z. B. für den Unterstrich im domain-part. Hast du eine Quelle?
Brazo Alkher
Beiträge: 103
Registriert: Fr 28. Jan 2005, 15:15
Wohnort: Unna
Kontaktdaten:

Beitrag von Brazo Alkher »

calvini hat geschrieben:@Brazo: Habe mich von dir nicht kritisiert gefühlt. Mich ärgert lediglich das undifferenzierte Herunterputzen anderer. Woher hast du die Basis für deine RegExp? Sonderzeichen im local-part sind nach meinem Kenntnisstand nicht erlaubt, gleiches gilt z. B. für den Unterstrich im domain-part. Hast du eine Quelle?
also meines Wissenstandes sind E-Mail Adressen wie
rstchen@unna.de
sehr wohl gültig

aber woher ich die Infos habe kann ich dir nicht mehr genau sagen.

Aber da diese Diskussion jetzt angestachelt wurde, schaue ich mal ob ich am WE mich durch dir RFCs hangele und Teile unserer beiden Regex bestätige, ergänze oder wiederlege :-)
Gesperrt