PHP Formularvalidierung: URL- und E-Mail-Felder
Erfahren Sie, wie Sie in PHP E-Mail- und URL-Felder mit filter_var und regulären Ausdrücken zuverlässig validieren.
E-Mail und URL sind zwei der häufigsten Felder in jedem Webformular – und gleichzeitig zwei der Felder, bei denen Benutzern am leichtesten Fehler unterlaufen. Ein Tippfehler wie user@example (ohne Top-Level-Domain) oder example.com (eine URL ohne Schema) besteht eine naive „ist es nicht leer"-Prüfung, schlägt jedoch fehl, sobald Ihre Anwendung versucht, eine Nachricht zu senden oder dem Link zu folgen.
Dieses Kapitel zeigt, wie man E-Mail- und URL-Eingaben in PHP validiert – also prüft, ob ein Wert die erwartete Form hat, bevor man ihn speichert oder verwendet. Validierung ist ein Schritt in einem größeren Ablauf, der auch das Einlesen der Daten aus $_POST/$_GET, das Bereinigen und das Sanitieren umfasst. Den vollständigen Überblick finden Sie unter PHP Formularverarbeitung und PHP Formularvalidierung.
Wir behandeln zwei Ansätze: die eingebaute Funktion filter_var (empfohlen) und reguläre Ausdrücke (hilfreich zum Verstehen, gelegentlich für benutzerdefinierte Regeln erforderlich).
E-Mail-Eingaben validieren
Der sauberste Weg, eine E-Mail-Adresse in PHP zu validieren, ist die Funktion filter_var mit dem Filter FILTER_VALIDATE_EMAIL. Sie gibt den gefilterten Wert zurück, wenn die Zeichenkette wie eine gültige E-Mail aussieht, und false, wenn nicht – sie lässt sich daher gut mit einer if-Abfrage kombinieren:
Da filter_var bei ungültiger Eingabe false (nicht null) zurückgibt, sollte der Vergleich immer mit dem losen ! oder dem strikten === false erfolgen. Ein häufiger Fehler ist if (filter_var($email, FILTER_VALIDATE_EMAIL) == false) für eine Adresse wie 0 – das funktioniert hier zwar, aber generell ist === false vorzuziehen, um PHPs Überraschungen beim losen Vergleich zu vermeiden.
E-Mail mit einem regulären Ausdruck validieren
Eine E-Mail lässt sich auch mit einem regulären Ausdruck validieren – einem Muster, das beschreibt, welche Zeichenketten erlaubt sind – mithilfe von preg_match. Das ist durchaus nützlich zu wissen, sollte aber nur verwendet werden, wenn eine Regel benötigt wird, die filter_var nicht ausdrücken kann (zum Beispiel die Beschränkung auf eine einzige Unternehmensdomäne):
Hinweis: Bevorzugen Sie in der Produktion
FILTER_VALIDATE_EMAILgegenüber einem selbst geschriebenen regulären Ausdruck. Die vollständige E-Mail-Spezifikation (RFC 5322) ist notorisch schwer mit einem einzigen Muster abzudecken, und der obige Ausdruck lehnt durchaus gültige Adressen ab, wie lange Top-Level-Domains (.museum) oder Adressen mit+-Tag ([email protected]). Weitere Informationen zur Mustersyntax finden Sie unter PHP Reguläre Ausdrücke.
URL-Eingaben validieren
URLs werden auf dieselbe Weise validiert: mit filter_var und dem Filter FILTER_VALIDATE_URL. Ein wichtiges Detail: Der Filter erfordert ein Schema (http://, https://, ftp://, …). Eine bloße example.com oder www.example.com wird als ungültig gemeldet. Entscheiden Sie daher im Voraus, ob Ihr Formular erwartet, dass Benutzer das Präfix https:// eingeben.
FILTER_VALIDATE_URL akzeptiert zusätzliche Flags, um die Regel zu verschärfen – zum Beispiel FILTER_FLAG_PATH_REQUIRED (die URL muss einen Pfad nach dem Host enthalten) oder FILTER_FLAG_QUERY_REQUIRED (sie muss einen Query-String enthalten):
<?php
$url = "https://example.com/page?ref=newsletter";
if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED)) {
echo "Valid URL with a query string";
} else {
echo "Missing or invalid query string";
}
?>URL mit einem regulären Ausdruck validieren
Wie bei E-Mails kann eine URL auch mit einem regulären Ausdruck abgeglichen werden. Das folgende Muster ist permissiv und sollte eher als Lernhilfe denn als Produktionsregel betrachtet werden:
Hinweis: Für E-Mails und URLs sind die eingebauten
filter_var-Filter die empfohlene Wahl. Sie werden gemeinsam mit PHP gepflegt, decken Sonderfälle ab, die reguläre Ausdrücke übersehen, und sind im Code deutlich lesbarer.
Alles zusammen in einem Formular
In einem echten Formular arbeitet man nicht mit fest codierten Zeichenketten – man liest die übermittelten Werte aus dem Superglobal $_POST, bereinigt sie und sammelt alle Fehler, um sie auf einmal anzuzeigen. Dieses Beispiel validiert eine Pflicht-E-Mail und eine optionale Website:
<?php
// Imagine these come from a submitted <form method="post">.
$email = trim($_POST["email"] ?? "");
$website = trim($_POST["website"] ?? "");
$errors = [];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Please enter a valid email address.";
}
// Website is optional: only validate it when something was typed.
if ($website !== "" && !filter_var($website, FILTER_VALIDATE_URL)) {
$errors[] = "Please enter a valid URL.";
}
if (empty($errors)) {
echo "All inputs are valid.";
} else {
echo implode("\n", $errors);
}
?>Der Null-Koaleszenz-Operator ?? "" verhindert eine Warnung, wenn das Feld fehlt, und die Prüfung $website !== "" macht die URL optional. Dies ist dasselbe Muster wie in PHP Pflichtfelder im Formular.
Validierung vs. Sanitierung
Validierung beantwortet die Frage „Hat dieser Wert die richtige Form?" – sie entfernt oder maskiert keine gefährlichen Zeichen. Das ist Aufgabe der Sanitierung. PHP bietet Sanitierungsfilter wie FILTER_SANITIZE_EMAIL, der Zeichen entfernt, die in einer E-Mail-Adresse nicht erlaubt sind:
<?php
$raw = "user(at)example.com";
$clean = filter_var($raw, FILTER_SANITIZE_EMAIL); // "useratexample.com"
if (filter_var($clean, FILTER_VALIDATE_EMAIL)) {
echo "Usable email: $clean";
} else {
echo "Could not produce a valid email";
}
?>Hier verwandelt die Sanitierung user(at)example.com in useratexample.com, was dann die Validierung nicht besteht – genau das richtige Ergebnis, da das Original keine echte Adresse war. Als Faustregel gilt: Validieren, um anzunehmen oder abzulehnen; sanitieren vor der Ausgabe; und niemals Formulareingaben vertrauen. Informationen zum Maskieren von Daten für HTML oder eine Datenbank finden Sie unter htmlspecialchars und mysqli::real_escape_string.
Zusammenfassung
- Verwenden Sie
filter_var($value, FILTER_VALIDATE_EMAIL)undfilter_var($value, FILTER_VALIDATE_URL)für zuverlässige, lesbare Validierung. FILTER_VALIDATE_URLerfordert ein Schema wiehttps://; mit Flags wieFILTER_FLAG_PATH_REQUIREDlässt sich die Regel verschärfen.- Reguläre Ausdrücke können diese Formate ebenfalls validieren, sind aber fehleranfällig – bevorzugen Sie die eingebauten Filter.
- Validierung und Sanitierung sind verschiedene Aufgaben; verwenden Sie beide und behandeln Sie alle übermittelten Daten als nicht vertrauenswürdig.