Die Validierung von E-Mail-Adressen ist eine der häufigsten Aufgaben in der Webentwicklung. PHP bietet dafür mit filter_var() eine einfache und zuverlässige Lösung, die seit PHP 5.2 verfügbar ist.
E-Mail-Validierung mit filter_var()
Die empfohlene Methode zur E-Mail-Validierung in PHP ist filter_var() mit dem Filter FILTER_VALIDATE_EMAIL. Diese Funktion prüft die E-Mail-Adresse nach dem RFC 822 Standard und ist zuverlässiger als jede selbst geschriebene Regex.
<?php
/**
* E-Mail-Adresse mit filter_var() validieren.
* Gibt die E-Mail zurück wenn gültig, sonst false.
*/
$email = 'test@beispiel.de';
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false) {
echo 'Die E-Mail-Adresse ' . htmlspecialchars($email, ENT_QUOTES, 'UTF-8') . ' ist gültig.';
} else {
echo 'Das ist keine gültige E-Mail-Adresse!';
}
?>
Wiederverwendbare Validierungsfunktion
Für den praktischen Einsatz empfiehlt sich eine eigene Funktion, die alle Prüfungen bündelt:
<?php
/**
* Prüft eine E-Mail-Adresse auf Gültigkeit.
*
* @param string $email Die zu prüfende E-Mail-Adresse
* @return bool true wenn gültig, sonst false
*/
function email_check(string $email): bool
{
/** Leerzeichen entfernen */
$email = trim($email);
/** Syntaxprüfung mit filter_var */
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
return false;
}
return true;
}
/** Anwendungsbeispiel */
$email = 'info@php-space.info';
if (email_check($email)) {
echo 'E-Mail-Adresse ist gültig.';
} else {
echo 'E-Mail-Adresse ist ungültig.';
}
?>
Erweiterte Prüfung mit DNS-Check
Zusätzlich zur Syntaxprüfung können Sie mit checkdnsrr() verifizieren, ob die Domain der E-Mail-Adresse tatsächlich existiert und einen Mailserver (MX-Record) besitzt:
<?php
function email_check_erweitert(string $email): bool
{
$email = trim($email);
/** Schritt 1: Syntaxprüfung */
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
return false;
}
/** Schritt 2: Domain extrahieren */
$domain = substr($email, strrpos($email, '@') + 1);
/** Schritt 3: DNS-Prüfung - hat die Domain einen MX-Record? */
if (!checkdnsrr($domain, 'MX')) {
return false;
}
return true;
}
/** Anwendungsbeispiel */
var_dump(email_check_erweitert('test@beispiel.de'));
var_dump(email_check_erweitert('test@diese-domain-gibt-es-nicht-xyz.de'));
?>
Warum kein eigener regulärer Ausdruck?
Eigene reguläre Ausdrücke für E-Mail-Validierung sind fehleranfällig und decken selten alle gültigen E-Mail-Formate ab. Typische Probleme:
- Unescapte Punkte im Regex (
. matcht jedes Zeichen statt nur einen Punkt) - Fehlende Unterstützung für neue Top-Level-Domains (z.B.
.museum, .berlin) - Fehlende Unterstützung für internationale Zeichen (Umlaute, kyrillische Buchstaben)
- Der E-Mail-Standard (RFC 5321/5322) ist komplex – ein vollständiger Regex wäre extrem lang
filter_var() implementiert diese Regeln bereits korrekt und wird mit jeder PHP-Version aktualisiert.
Zusammenfassung
- Verwenden Sie
filter_var($email, FILTER_VALIDATE_EMAIL) als Standardmethode - Ergänzen Sie bei Bedarf einen DNS-Check mit
checkdnsrr() - Vermeiden Sie eigene reguläre Ausdrücke für E-Mail-Validierung
- Escapen Sie E-Mail-Adressen bei der Ausgabe immer mit
htmlspecialchars()