Ob Kontaktformular, Newsletter-Anmeldung oder API-Endpunkt: Kaum ein PHP-Projekt kommt ohne die Prüfung von E-Mail-Adressen und URLs aus. Mit PHP filter_validate_email und den verwandten FILTER_VALIDATE_-Konstanten bringt die Sprache dafür fertige Werkzeuge mit, die eigene Regex-Basteleien in den meisten Fällen überflüssig machen.
Warum PHP filter_validate_email und Co besser sind als eigene Regex
Die Funktion filter_var() von PHP ist das eingebaute Werkzeug für typische Eingabevalidierungen. Mit Konstanten wie PHP filter_validate_email, FILTER_VALIDATE_URL, FILTER_VALIDATE_IP, FILTER_VALIDATE_DOMAIN und FILTER_VALIDATE_REGEXP lassen sich die häufigsten Prüfungen in einer Zeile erledigen, ohne dass jemand seine eigene Regex pflegen muss. Die Filter folgen anerkannten Standards (RFC für E-Mails, RFC für URLs, IPv4/IPv6 nach IETF) und werden zentral mit PHP gepflegt.

Bevor die einzelnen Filter und ihre Flags an Beispielen folgen, eine kurze Einordnung dieses Tutorials gegenüber dem allgemeinen filter_var()-Einstieg.
Dieses Tutorial konzentriert sich auf die spezifischen Validate-Filter und ihre Flags. Wer zuerst einen breiten Einstieg in filter_var() und seine Bedeutung sucht, findet das im Tutorial über die allgemeine Eingabefilterung. Hier geht es konkret darum, welcher Filter für welchen Datentyp passt und welche Flags die Prüfung verfeinern.
PHP filter_validate_email für E-Mail-Adressen
Der häufigste Einsatz ist die E-Mail-Validierung. PHP filter_validate_email prüft die Syntax einer E-Mail-Adresse und liefert die Adresse zurück, falls sie passt, sonst false. Im Erfolgsfall bekommt der Aufrufer also die unveränderte Eingabe als String. Wichtig ist die strikte Prüfung mit === false, weil filter_var() bei einer gültigen Adresse einen String zurückgibt, der niemals leer und damit truthy ist.
<?php
$eingabe = $_POST['email'] ?? '';
if (filter_var($eingabe, FILTER_VALIDATE_EMAIL) === false) {
echo 'Bitte eine gueltige E-Mail eingeben.';
} else {
echo 'E-Mail ok: ' . htmlspecialchars($eingabe);
}
Wichtig zu wissen: PHP filter_validate_email prüft nur die Syntax, nicht die Existenz der Mailadresse. Dass mia@example.com syntaktisch korrekt ist, sagt nichts darüber aus, ob es ein Postfach gibt, das diese Mails entgegennimmt. Für den Existenznachweis bleibt der klassische Confirm-Mail-Workflow mit Token-Link das verlässliche Mittel. Der Filter ersetzt also keine Doppelt-Opt-In-Strategie, sondern ist die schnelle Vor-Prüfung, die kaputte Eingaben sofort aussortiert.
PHP filter_validate_email Verwandte: FILTER_VALIDATE_URL mit Flags
URLs sehen oft korrekt aus, sind aber in Wirklichkeit unbrauchbar, weil ein Schema fehlt oder kein Pfad angegeben ist. Mit Flags lässt sich FILTER_VALIDATE_URL deutlich strenger machen.
<?php
$url = 'https://php-space.info/php-tutorials/';
$flags = FILTER_FLAG_HOST_REQUIRED | FILTER_FLAG_PATH_REQUIRED;
if (filter_var($url, FILTER_VALIDATE_URL, $flags) !== false) {
echo 'URL ok';
} else {
echo 'URL ungueltig';
}
/* "https://" ohne Pfad: false
"//example.com/pfad": false (kein Schema)
"ftp://server/file": true (auch FTP-Schema akzeptiert) */
Standardmäßig akzeptiert FILTER_VALIDATE_URL jede syntaktisch korrekte URL, auch ohne Host. Mit FILTER_FLAG_HOST_REQUIRED muss ein Host enthalten sein, mit FILTER_FLAG_PATH_REQUIRED zusätzlich ein Pfad. Wer ausschließlich HTTP- oder HTTPS-URLs akzeptieren möchte, ergänzt einen separaten Check mit parse_url() und prüft das Schema gezielt, weil FILTER_VALIDATE_URL auch ftp://, mailto: oder javascript: durchlässt.
FILTER_VALIDATE_IP neben PHP filter_validate_email für IPv4 und IPv6
PHP filter_validate_email hat für IP-Adressen einen wichtigen Verwandten. Bei IP-Adressen erlaubt der Filter eine feine Trennung in v4 und v6. Standardmäßig akzeptiert FILTER_VALIDATE_IP beide Versionen, mit Flags lässt sich auf eine Variante einschränken.
<?php
$adresse = '192.168.1.42';
if (filter_var($adresse, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
echo 'Gueltige IPv4';
}
$v6 = '2001:db8::1';
if (filter_var($v6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
echo 'Gueltige IPv6';
}
/* No-Private-Range erzwingen */
$flags = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
if (filter_var($adresse, FILTER_VALIDATE_IP, $flags)) {
echo 'Oeffentliche IPv4';
} else {
echo 'Adresse aus privatem oder reserviertem Bereich';
}
Spannend sind die Flags FILTER_FLAG_NO_PRIV_RANGE und FILTER_FLAG_NO_RES_RANGE, die private (10.0.0.0/8, 192.168.0.0/16) bzw. reservierte (127.0.0.0/8) IP-Bereiche aussortieren. Genau das brauchen API-Endpunkte, die keine internen Adressen akzeptieren sollen, oder URL-Loader, die keine SSRF-Anfragen ans interne Netz erlauben möchten.
FILTER_VALIDATE_DOMAIN als Ergänzung zu PHP filter_validate_email
Wer nur eine Domain ohne http:// prüfen möchte, etwa für ein Newsletter-Setup oder eine Whitelist, greift zu FILTER_VALIDATE_DOMAIN. Mit FILTER_FLAG_HOSTNAME werden RFC-konforme Hostname-Regeln durchgesetzt.
<?php
$domain = 'php-space.info';
if (filter_var($domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) {
echo 'Gueltiger Hostname';
}
/* Akzeptiert: php-space.info, sub.example.com, my-host
Ablehnt: -minus-vorne.com, .punkt-vorne.com, leerzeichen mit name.de */
Ohne den Flag ist die Prüfung sehr permissiv und akzeptiert auch Strings, die in der Praxis kein gültiger Hostname sind. Der Flag schließt diese Lücke und macht den Filter zur natürlichen Wahl für Domain-Eingabefelder.
FILTER_VALIDATE_REGEXP zusätzlich zu PHP filter_validate_email
Wer PHP filter_validate_email kennt, will manchmal mehr. Manche Eingaben passen in keine Standard-Kategorie, etwa eine deutsche Postleitzahl oder eine Steuernummer. Statt preg_match() direkt aufzurufen, kann der eigene Regex sauber in einem filter_var()-Aufruf verpackt werden.
<?php
$plz = '50667';
$gepruefte = filter_var($plz, FILTER_VALIDATE_REGEXP, [
'options' => ['regexp' => '/^[0-9]{5}$/'],
]);
if ($gepruefte !== false) {
echo 'PLZ ok: ' . $gepruefte;
} else {
echo 'Bitte 5 Ziffern eingeben.';
}
Der Vorteil dieser Schreibweise gegenüber preg_match() ist die Konsistenz im Code: Alle Validierungen laufen über filter_var() und folgen dem gleichen Pattern. Wer mehrere Felder mit eigenen Regex prüft, kombiniert das mit filter_var_array() zu einem einzigen Aufruf, wie der nächste Abschnitt zeigt. Wer noch mehr über Regex in PHP wissen möchte, findet einen tieferen Einblick im Tutorial zu regulären Ausdrücken.
Mehrere Felder mit PHP filter_validate_email und filter_var_array
Bei Formularen mit mehreren Feldern wird der Code mit einzelnen filter_var()-Aufrufen schnell unübersichtlich. filter_var_array() nimmt das gesamte Eingabe-Array plus eine Spec, die pro Feld den passenden Filter beschreibt.
<?php
$daten = [
'email' => 'mia@example.com',
'webseite' => 'https://php-space.info',
'plz' => '50667',
];
$spec = [
'email' => FILTER_VALIDATE_EMAIL,
'webseite' => ['filter' => FILTER_VALIDATE_URL, 'flags' => FILTER_FLAG_HOST_REQUIRED],
'plz' => ['filter' => FILTER_VALIDATE_REGEXP, 'options' => ['regexp' => '/^[0-9]{5}$/']],
];
$ergebnis = filter_var_array($daten, $spec);
print_r($ergebnis);
Im Ergebnis-Array stehen pro Feld entweder der geprüfte Wert oder false, falls die Validierung fehlgeschlagen ist. Der ganze Validierungs-Block lässt sich so in einem zentralen Helper kapseln, was den Controller-Code kurz und konsistent hält. Mehr Details und Patterns gibt es im Tutorial zu filter_var_array.
Edge-Cases und was PHP filter_validate_email nicht tut
Auch der beste Filter hat Grenzen. PHP filter_validate_email folgt einer simplifizierten RFC-5322-Variante, die nicht jede technisch erlaubte Mailadresse akzeptiert. Adressen mit Anführungszeichen im lokalen Teil oder mit Kommentaren in Klammern werden zwar von einigen Mail-Servern akzeptiert, aber von PHP als ungültig markiert. Für 99,9 Prozent der Praxisfälle ist das kein Problem, weil solche Adressen extrem selten und meist in alten Systemen entstanden sind.
Internationalisierte Domain-Namen (IDN) wie mia@müller.de werden ebenfalls nicht direkt akzeptiert. Hier hilft idn_to_ascii(), das die Domain in das Punycode-Format umwandelt, bevor der Filter prüft.
<?php
$mail = 'mia@müller.de';
$lokal = explode('@', $mail)[0];
$domain = idn_to_ascii(explode('@', $mail)[1]);
$ascii = $lokal . '@' . $domain;
if (filter_var($ascii, FILTER_VALIDATE_EMAIL) !== false) {
echo 'Gueltig (Punycode-Form): ' . $ascii;
}
/* Gueltig (Punycode-Form): mia@xn--mller-kva.de */
Bei FILTER_VALIDATE_BOOLEAN ist Vorsicht geboten: Anders als die anderen Validate-Filter gibt er bei einem ungültigen Wert null zurück, nicht false. Wer den Default-Prüf-Pfad mit === false benutzt, wird hier überrascht. Der saubere Weg ist filter_var($wert, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) und ein anschließender === null-Check.
Wer die Validate-Filter in einer Helper-Funktion oder einem Service-Layer kapselt, kann die Validierungs-Regeln pro Feldtyp an einer einzigen Stelle pflegen. Spätere Anpassungen an Flags oder Edge-Cases müssen dann nicht durch das ganze Projekt nachgezogen werden.
Fazit zu PHP filter_validate_email
Mit den Validate-Filtern stellt PHP eine Werkzeugkiste bereit, die fast alle Standard-Eingabevalidierungen abdeckt. PHP filter_validate_email prüft Mailadressen syntaktisch, FILTER_VALIDATE_URL mit den Flags HOST_REQUIRED und PATH_REQUIRED macht URL-Prüfungen strikt, FILTER_VALIDATE_IP trennt v4 und v6 sauber, und FILTER_VALIDATE_DOMAIN mit FILTER_FLAG_HOSTNAME validiert reine Domain-Eingaben. Eigene Muster lassen sich mit FILTER_VALIDATE_REGEXP integrieren, mehrere Felder gleichzeitig mit filter_var_array(). Wichtig bleibt das Bewusstsein, dass alle Filter nur die Form prüfen, nicht den fachlichen Inhalt: Eine technisch gültige Mail kann trotzdem nicht zustellbar sein. Mit dieser Klarheit sind die FILTER_VALIDATE_-Konstanten der schnelle, zuverlässige Default für praktisch jede Eingabevalidierung.