Sven Rautenberg: Email überprüfen mit preg_match

Beitrag lesen

Moin!

Ich über prüfe meine Emaileingabe auf valität, doch jetzt habe ich ein kleines Problem, ich bekomme einen fehler wenn die Email test.test@example.com heisst.

Wo habeich den da den Fehler?

Im Regex insgesamt.

Deine Forderungen laut Regex:

1. Mailadresse darf nicht mit Ziffern beginnen - das ist Unsinn. An der Stelle des ersten Zeichens dürfen sehr wohl 0-9 auftreten - allerdings akzeptierst du hier jedes andere mögliche Zeichen, und das ist dann doch eher unsinnig.

2. Als weitere Zeichen kommen dann mindestens eines aus "a-zA-Z0-9_-". Damit hätte der Useranteil schon eine Mindestlänge von zwei Zeichen, was ebenfalls unsinnig ist.

3. Danach kommt eventuell ein Punkt unnd weitere Zeichen obiger Klassifizierung, allerdings jetzt mit Punkt drin. Das ganze Null bis unendlich oft. Naja, unendlich lange Mailadressen gibts nicht, aber dass vor dem ersten Punkt in der Mailadresse mindestens zwei Zeichen kommen müssen, und nach dem Punkt mindestens eines, ist auch falsch. Der Punkt ist ein ganz normales Zeichen in Mailadressen.

4. Ein @ muss vorkommen. Das ist ok. Warum es als Zeichenklasse notiert ist, erschließt sich allerdings nicht, die eckigen Klammern sind überflüssig.

5. Im Domainteil geht es lustig weiter. Beispielsweise ist der Unterstrich als Zeichen erlaubt - der ist nun aber in Domains gerade verboten, zumindest in denen, die im DNS-System stehen. Ich hatte mal einen Admin, der hat Unterstrich-Domains in der lokalen Hosts-Datei definiert und das erst rückgängig gemacht, als ich ihm berichten musste, dass meine Software diese Domain nicht akzeptiert, weil die eben dns-gültige Namen validiert.

6. Wie gehts weiter in der Domain: Nach mindestens einem Zeichen kommt etwas, was mit Punkt beginnt und danach auch mindestens ein Zeichen enthält. Soweit OK (bis auf den Unterstrich).

7. Danach dann noch mal ein Punkt sowie zwei bis vier Zeichen a-zA-Z - das ist wiederum falsch, denn als Top-Level-Domain gibt es ebenfalls keinerlei Begrenzung - wenn man die Nachrichten verfolgt, werden gerade beliebig viele neue Domainnamen ausgedacht und registriert, und ".museum" ist schon lange existent. Es gibt eine Längenbeschränkung für Domainnamen: Jedes Einzelteil darf nicht länger als 63 Zeichen sein, es darf nicht mehr als 127 Einzelteile geben, und insgesamt darf die Domain nicht länger als 255 Zeichen sein. Das gilt auch für die Top-Level-Domain.

if (preg_match('/[1][a-zA-Z0-9_-]+([.][a-zA-Z0-9._-]+)*[@][a-zA-Z0-9_-]+([.][a-zA-Z0-9_-]+)*[.][a-zA-Z]{2,4}$/', $mail))

Insofern ist das Mailvalidieren mit regulärem Ausdruck relativ sinnlos. Einerseits beweist es nicht, dass die Mailadresse existiert und bemailt werden darf, andererseits entscheidet der Mailserver, den man benutzen möchte, über die Korrektheit einer Adresse und würde sich im Zweifel melden.

Mein Ansatz für die Validierung von Mailadressen war bislang immer: preg_match("/^.+@.+\..+$/", $mail) - das ist simpel genug, dass man es nicht kaputtkriegen kann. Mindestens ein Zeichen vor dem @, mindestens ein Punkt hinter dem @, getrennt durch Zeichen.

PHP bietet allerdings auch noch eine Alternative: filter_var().

Das Beispiel auf der Seite zeigt praktischerweise das Vorgehen für Mailadressen, in zwei Varianten:

<?php  
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));  
var_dump(filter_var('example.com', FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED));  
?>  

- Sven Rautenberg


  1. ^0-9 ↩︎