Menu

PHP filter_var(): E-Mail, Int, URL und mehr validieren

filter_var($value, FILTER_VALIDATE_EMAIL) liefert den Wert, wenn er gültig ist, und sonst false; FILTER_VALIDATE_INT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL und FILTER_VALIDATE_IP funktionieren genauso. Hier: die Optionen (min_range, default), Flags, Sanitize-Filter und die Falle false gegen 0.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

filter_var($value, FILTER_VALIDATE_EMAIL) liefert den Wert, wenn er eine gültige E-Mail-Adresse ist, und false, wenn nicht. Tausch den Filter aus, um andere Formate zu prüfen: FILTER_VALIDATE_INT, FILTER_VALIDATE_FLOAT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL, FILTER_VALIDATE_IP. Vergleiche das Ergebnis immer mit === false.

Zwei Ergebnisse überraschen. ada@example wird abgelehnt, weil die Domain keinen Punkt hat, und ' ada@example.com' wegen des führenden Leerzeichens, also wendest du trim() auf die Eingabe an, bevor du validierst.

Eine E-Mail aus einem Formular validieren

Dieselbe Prüfung hinter einem Formular. Führe es aus, tippe eine Adresse ein und klicke auf Check; der Block läuft erneut mit deiner Eingabe in $_POST.

FILTER_VALIDATE_EMAIL prüft nur das Format. nobody@example.com besteht, und eine Adresse mit Tippfehler in der Domain würde es auch. Nicht-ASCII-Zeichen werden abgelehnt: adä@example.com besteht nur mit FILTER_FLAG_EMAIL_UNICODE, das sie vor dem @ erlaubt, und eine Domain wie exämple.com scheitert selbst mit dem Flag, außer du wandelst sie zuerst in ihre xn---Form um. Der einzige Weg zu wissen, dass eine Adresse funktioniert, ist, ihr einen Bestätigungslink zu schicken.

Eine Ganzzahl validieren, mit min_range und max_range

FILTER_VALIDATE_INT macht aus einem gültigen String einen int und lehnt alles andere ab. Das Options-Array fügt einen Bereich und einen Standardwert hinzu:

Leerraum drumherum und ein führendes + werden akzeptiert, eine führende Null ('042') nicht, und das Ergebnis für '42' ist die Ganzzahl 42, nicht der String. Außerhalb des Bereichs ergibt false; mit einer Option default bekommst du statt false den Standardwert, praktisch für Dinge wie ?page= (siehe GETund_GET und _POST). Füge FILTER_FLAG_ALLOW_HEX oder FILTER_FLAG_ALLOW_OCTAL hinzu, um 0x1A oder 0755 zu akzeptieren.

Die Falle 0 und false

Ein gültiges '0' liefert die Ganzzahl 0, und 0 ist falsy. Ein einfaches if behandelt das als Fehlschlag:

Dasselbe gilt für FILTER_VALIDATE_FLOAT ('0.0') und FILTER_VALIDATE_BOOL, wo false eine gültige Antwort ist. Dafür gibt es FILTER_NULL_ON_FAILURE.

Booleans, Floats, URLs und IP-Adressen

FILTER_VALIDATE_BOOL ist der Name aus PHP 8; FILTER_VALIDATE_BOOLEAN ist derselbe Filter. Ohne FILTER_NULL_ON_FAILURE würde 'maybe' false liefern, nicht unterscheidbar von 'off'.

FILTER_VALIDATE_URL prüft, ob der String wie eine URL aufgebaut ist, mit einem beliebigen Schema. Dazu gehören Schemata, die du nie in einem href haben willst:

javascript://comment%0Aalert(1) besteht FILTER_VALIDATE_URL, und ein Browser führt es beim Klicken auf den Link als JavaScript aus, weil %0A den //comment beendet. Prüfe das Schema mit parse_url(), bevor du die URL eines Nutzers in eine Seite ausgibst. Mit FILTER_FLAG_PATH_REQUIRED und FILTER_FLAG_QUERY_REQUIRED kannst du außerdem Teile verlangen.

Sanitize-Filter

Sanitize-Filter entfernen Zeichen, statt Ja oder Nein zu sagen. Sie sind nützlich, um Eingaben zu normalisieren, nicht, um sie sicher ausgeben zu können:

Schau dir die erste Zeile an: Order #12-345 (x2) wird zu 12-3452, einer Zahl, die nie in der Eingabe stand, und die dritte Zeile ist eine Adresse, die niemand getippt hat. Wenn du bereinigst, validierst du das Ergebnis danach. Für alles, was du in HTML ausgibst, ist htmlspecialchars() bei der Ausgabe das richtige Werkzeug (FILTER_SANITIZE_FULL_SPECIAL_CHARS macht dasselbe Escaping). FILTER_SANITIZE_STRING ist seit PHP 8.1 veraltet; was du stattdessen verwendest, steht unter htmlspecialchars.

Ein ganzes Formular mit filter_var_array validieren

filter_var_array() wendet einen Filter pro Schlüssel an und liefert ein Array mit jedem Schlüssel, nach dem du gefragt hast: den gefilterten Wert, false, wenn die Validierung gescheitert ist, oder null, wenn der Schlüssel fehlte.

role ist weg: Schlüssel, die du nicht aufgeführt hast, werden verworfen, und das verhindert, dass ein Besucher role=admin zu einem Formular hinzufügt und es gespeichert wird. country ist null, weil es nicht gesendet wurde. Auf einem Webserver macht filter_input_array(INPUT_POST, $rules) dasselbe und liest direkt aus der Anfrage.

Häufig gestellte Fragen

Wie validiere ich in PHP eine E-Mail-Adresse?

Mit filter_var($email, FILTER_VALIDATE_EMAIL), das den E-Mail-String liefert, wenn er gültig ist, und sonst false: if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { /* invalid */ }. Es prüft nur das Format; um zu wissen, ob die Adresse existiert, schickst du eine Bestätigungs-E-Mail.

Wie prüfe ich in PHP, ob ein String eine Ganzzahl ist?

filter_var($s, FILTER_VALIDATE_INT) liefert den int für "42", "-7" und " 42 " und false für "4.2", "42abc" oder "042". Vergleiche mit !== false, denn ein gültiges "0" liefert 0, und das ist falsy.

Warum liefert filter_var bei 0 false?

Tut es nicht: filter_var('0', FILTER_VALIDATE_INT) liefert die Ganzzahl 0. Der Bug steckt in der Prüfung, if (filter_var(...)), die 0 wie false behandelt. Schreib if (filter_var($v, FILTER_VALIDATE_INT) !== false).

Was hat FILTER_SANITIZE_STRING in PHP 8.1 ersetzt?

Direkt nichts; es wurde als veraltet markiert, weil sein Name eine Sicherheit versprach, die es nicht bot. Validiere die Eingabe, die du erwartest, speichere sie unverändert und escape sie bei der Ausgabe mit htmlspecialchars(). Wenn du Tags entfernen musst, verwende strip_tags().

Was ist der Unterschied zwischen filter_var und filter_input?

filter_var() filtert jeden Wert, den du übergibst. filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) liest direkt aus der ursprünglichen Anfrage, liefert also null, wenn der Parameter fehlt, und ignoriert alle Änderungen, die dein Code an $_GET gemacht hat. Beide nehmen dieselben Filter und Optionen.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S