Seite 1 von 3

Schönheitsfehler in isValidMail()

Verfasst: Di 18. Sep 2007, 22:47
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);

Verfasst: Mi 19. Sep 2007, 07:11
von Dodger77
verschoben

Verfasst: Do 20. Sep 2007, 10:58
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

Verfasst: Do 20. Sep 2007, 11:06
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?

Verfasst: Do 20. Sep 2007, 11:42
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 ...

Verfasst: Do 20. Sep 2007, 13:00
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.

Verfasst: Do 20. Sep 2007, 13:01
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

Verfasst: Do 20. Sep 2007, 13:07
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).

Verfasst: Do 20. Sep 2007, 13:24
von calvini
Und der Vollständigkeit halber noch der RFC für die Domain-Namen: RFC 1035.

Verfasst: Do 20. Sep 2007, 17:05
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.

Verfasst: Fr 21. Sep 2007, 10:08
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]

Verfasst: Fr 21. Sep 2007, 10:26
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)

Verfasst: Fr 21. Sep 2007, 11:01
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.

Verfasst: Fr 21. Sep 2007, 11:19
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?

Verfasst: Fr 21. Sep 2007, 12:41
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 :-)