Regular Expression + mail Adresse

Hallo,

ich quäle mich schon seit einigen Stunden mit Regulären Ausdrücken herum. Nun soll ich eine mail Adresse auf Korrektheit prüfen. Der Host-Teil ist kein Problem, aber beim Namens-Teil komme ich einfach nicht weiter. Laut Anforderung soll im Namensteil an erster Stelle ein ein Buchstabe stehen. Darauf dürfen nun Zahlen, Buchstaben, '-', '_' und '.' folgen, wobei ein Punkt nur einzeln auftreten darf. Also nicht mehrere Punkte hinter einander. D. h. also, dass nach jedem Punkt eine Zahl, ein Buchstabe, ein '-' oder ein '_' kommen muss.

Code:
Namens-Teil @ Host-Teil

Regular Expression für den Namens-Teil:
[a-z]{1}((\.)?([a-z0-9_\-]){1})*

Der obige Ausdruck erfüllt fast alle Anforderungen:
test123@... --> wird als gültig erkannt
test.test@... --> wird als gültig erkannt
test-test@... --> wird als gültig erkannt
test..123@... --> wird als ungültig erkannt
test..test@... --> wird NICHT als ungültig erkannt??? Warum wird diese Mailadresse als gültig erkannt (obwohl nicht gültig) und die Adresse darüber als ungültig (ist auch ungültig)?

Danke und Frohe Ostern!
goflo
 
Eine nach RFC 2822 gültige Adresse kannst du mit dieser Regexe validieren:

Code:
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Zu den Details siehe: http://www.regular-expressions.info/email.html Da findest du auch noch andere Beispiele.
 
Wollte nur mal hinzufügen, dass nach dem RFC eine Email wie bspw. diese: !@$.de oder !@0.de erlaubt ist, komischerweise und würde deshalb empfehlen seine eigenen Suchmuster zu benutzen. Natürlich sollte er alles sehr gut validieren ;)

MfG
Keci
 
Danke für eure Antworten! Ich habe das kurz mit der RFC konformen Expression getestet und das Ergebnis ist seltsamerweise das selbe.

test..test@... --> wird als NICHT als ungültig erkannt
test..123@... --> wird als untültig erkannt X(

ich bin verwirrt ?(

edit:
Weis jemand wie die Boardsoftware hier erkennt ob es sich um eine gültige Mailadresse handelt? Das Board wandelt die Adressen nämlich korrekt in mailto-Links um:

 
Original von Keci
Wollte nur mal hinzufügen, dass nach dem RFC eine Email wie bspw. diese: !@$.de oder !@0.de erlaubt ist, komischerweise und würde deshalb empfehlen seine eigenen Suchmuster zu benutzen. Natürlich sollte er alles sehr gut validieren ;)

Das sehe ich anders. Sich selbst ein Suchmuster für die Validierung zu erstellen ist verdammt schwierig bis unmöglich. Außerdem sollte das Muster flexibel sein. Stell dir mal vor, die DENIC würde aufeinmal die Domain 0.de aus unerfindlichen Gründen erlauben. Dann wäre der selbstgestrickte Ausdruck fehlerhaft und soetwas sollte man möglichst gut vermeiden.

@OP:

Ich nehme an, du möchtest soetwas haben:

Code:
^[a-z]+\.?[a-z0-9_-]+$

Denke daran, die entsprechende Funktion dann caseinsensitive zu machen. Außerdem sind die "Vorgaben", die du da hast, mehr als fraglich. Besser wäre die Alternative von Bitmuncher.
 
Außerdem sind die "Vorgaben", die du da hast, mehr als fraglich. Besser wäre die Alternative von Bitmuncher.

Klar, die Vorgaben sind fraglich, aber das Ding wird nie zum Einsatz kommen und ist nur ein Beispiel für die Uni. ;)

Ich nehme an, du möchtest soetwas haben:
Code:
 ^[a-z]+\.?[a-z0-9_-]+$

jein. Dein Ausdruck funktioniert solange nur ein Punkt vorkommt. Aber bei zB test.test.test@test.com versagt die Prüfung obwohl die Adresse korrekt ist.
 
Original von goflo
Außerdem sind die "Vorgaben", die du da hast, mehr als fraglich. Besser wäre die Alternative von Bitmuncher.

Klar, die Vorgaben sind fraglich, aber das Ding wird nie zum Einsatz kommen und ist nur ein Beispiel für die Uni. ;)

Sag das doch gleich. :rolleyes:

Ich nehme an, du möchtest soetwas haben:
Code:
 ^[a-z]+\.?[a-z0-9_-]+$

jein. Dein Ausdruck funktioniert solange nur ein Punkt vorkommt. Aber bei zB test.test.test@test.com versagt die Prüfung obwohl die Adresse korrekt ist.[/quote]

Dann hab ich dich falsch verstanden.
Falls beliebig viele Punkte vorkommen dürfen, dann sieht der Ausdruck so aus:

Code:
^[a-z]+(\.?[a-z0-9_-])*$

oder auch so:

Code:
^[a-z](\.?[a-z0-9_-])*$

Das ist eine Frage der Optimierung, aber damit kenn ich mich nicht so gut aus. Ich vermute jedoch, dass der erste Code schneller ist.
 
Ansonsten, für deine weiteren regulären Ausdrücke:
(bezogen auf deinen ersten Ausduck)

Code:
[a-z]{1}
Hier brauchst du nicht "{1}" zu schreiben. Einfach nur "[a-z]" reicht aus, wenn du genau ein Vorkommen meinst. (dito ganz am Ende)

Code:
(\.)?
Hier ist die Klammer nicht zwingend notwendig. Man kann sie setzen, um die Übersicht zu vereinfachen, aber manchmal bewirkt soetwas auch das Gegenteil.

Code:
[a-z0-9_\-]
Der Ausdruck ist ebenfalls völlig korrekt. Jedoch brauchst du ein Zeichen mit Metacharakter (also höherer Bedeutung) nicht zu escapen, wenn es ganz am Ende einer solchen Aufzählung steht. In diesem Fall kannst du also den Backslash vor dem Minuszeichen ganz am Ende weglassen.
 
ich würde auf jeden Fall davon abraten, das selbst zu basteln... du erwischst niemals alle Fälle, die es gibt, und schließt somit einige valide Mail-Adressen aus.

zu diesem hier:
Original von goflo
test..test@... --> wird als NICHT als ungültig erkannt
test..123@... --> wird als untültig erkannt X(

poste mal bitte den kompletten Code, wo du den RegEx eingebaut hast... vieleicht ist da irgendwo ein Fehler drin...

nehm mal den von Bitmuncher geposteten Regex nach RFC 2822, copy&paste ihn auf http://rubular.com/ in das regex-Feld, setze in das Input-Feld hinter dem zweiten / ein i (für case insensitive) und escape die Forward Slashes (also vor jeden / im RegEx noch ein \ setzen...)

und dann gib mal deine Test-Adressen ein - da kommt folgendes raus:
Code:
test..test@bla.de         -> gefundene Mail-Adresse: test@bla.de
test..123@bla.de          -> gefundene Mail-Adresse: 123@bla.de
test.bla.blub.123@blub.de -> gefundene Mail-Adresse: test.bla.blub.123@blub.de


wenn du nicht aus dem Text irgendwo ne Mail-Addy rausfiltern willst, sondern nur testen willst, ob ein String als Ganzes eine gültige Mail-Adresse ist, dann setze ganz an den Anfang des RegEx noch ein ^ und ganz ans Ende ein $
dann kannst du z.B. mit preg_match() testen, ob der Gesamt-String zu dem regulären Ausdruck passt oder nicht.
 
Hallo beavisbee!

Danke auch für deine Antwort! Aber mittlerweile funktioniert alles ohne Probleme und wie bereits gesagt: ist nur für die Uni! Unser Prof. hat selbst keine Ahnung von daher reicht ihm meine Lösung auf jeden Fall!

Nochmal Danke an alle!
 
Zurück
Oben