Menu

PHP filter_var() : valider un email, un entier, une URL

filter_var($value, FILTER_VALIDATE_EMAIL) renvoie la valeur si elle est valide et false sinon ; FILTER_VALIDATE_INT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL et FILTER_VALIDATE_IP fonctionnent de la même façon. Les options (min_range, default), les drapeaux, les filtres de nettoyage et le piège false ou 0.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

filter_var($value, FILTER_VALIDATE_EMAIL) renvoie la valeur quand c'est une adresse email valide et false sinon. Changez le filtre pour vérifier d'autres formats : FILTER_VALIDATE_INT, FILTER_VALIDATE_FLOAT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL, FILTER_VALIDATE_IP. Comparez toujours le résultat avec === false.

Deux résultats surprennent. ada@example est refusée car le domaine n'a pas de point, et ' ada@example.com' est refusée à cause de l'espace initial, appliquez donc trim() à la saisie avant de la valider.

Valider un email venant d'un formulaire

La même vérification derrière un formulaire. Exécutez-le, tapez une adresse et cliquez sur Check ; le bloc s'exécute à nouveau avec votre saisie dans $_POST.

FILTER_VALIDATE_EMAIL ne vérifie que le format. nobody@example.com passe, tout comme une adresse avec une faute de frappe dans le domaine. Les caractères non ASCII sont refusés : adä@example.com ne passe qu'avec FILTER_FLAG_EMAIL_UNICODE, qui les autorise avant le @, et un domaine comme exämple.com échoue même avec ce drapeau, sauf si vous le convertissez d'abord sous sa forme xn--. Le seul moyen de savoir qu'une adresse fonctionne est de lui envoyer un lien de confirmation.

Valider un entier, avec min_range et max_range

FILTER_VALIDATE_INT transforme une chaîne valide en int et refuse tout le reste. Le tableau d'options ajoute une plage et une valeur par défaut :

Les espaces autour et un + initial sont acceptés, un zéro initial ('042') ne l'est pas, et le résultat pour '42' est l'entier 42, pas la chaîne. Hors de la plage, vous obtenez false ; avec une option default, vous obtenez la valeur par défaut au lieu de false, ce qui est pratique pour des choses comme ?page= (voir GETet_GET et _POST). Ajoutez FILTER_FLAG_ALLOW_HEX ou FILTER_FLAG_ALLOW_OCTAL pour accepter 0x1A ou 0755.

Le piège 0 et false

Un '0' valide renvoie l'entier 0, et 0 est évalué à faux. Un simple if le traite comme un échec :

C'est pareil pour FILTER_VALIDATE_FLOAT ('0.0') et FILTER_VALIDATE_BOOL, où false est une réponse valide. C'est à cela que sert FILTER_NULL_ON_FAILURE.

Booléens, floats, URL et adresses IP

FILTER_VALIDATE_BOOL est le nom de PHP 8 ; FILTER_VALIDATE_BOOLEAN est le même filtre. Sans FILTER_NULL_ON_FAILURE, 'maybe' renverrait false, impossible à distinguer de 'off'.

Une URL valide n'est pas un lien sûr

FILTER_VALIDATE_URL vérifie que la chaîne a la forme d'une URL, avec n'importe quel schéma. Cela inclut des schémas que vous ne voulez jamais dans un href :

javascript://comment%0Aalert(1) passe FILTER_VALIDATE_URL, et un navigateur l'exécute comme du JavaScript quand on clique sur le lien, car %0A termine le //comment. Vérifiez le schéma avec parse_url() avant d'afficher l'URL d'un utilisateur dans une page. Vous pouvez aussi exiger certaines parties avec FILTER_FLAG_PATH_REQUIRED et FILTER_FLAG_QUERY_REQUIRED.

Les filtres de nettoyage

Les filtres de nettoyage (sanitize) suppriment des caractères au lieu de répondre oui ou non. Ils sont utiles pour normaliser une saisie, pas pour la rendre sûre à l'affichage :

Regardez la première ligne : Order #12-345 (x2) devient 12-3452, un nombre qui n'a jamais figuré dans la saisie, et la troisième ligne est une adresse que personne n'a tapée. Si vous nettoyez, validez le résultat ensuite. Pour tout ce que vous affichez dans du HTML, htmlspecialchars() au moment de l'affichage est le bon outil (FILTER_SANITIZE_FULL_SPECIAL_CHARS fait le même échappement). FILTER_SANITIZE_STRING est déprécié depuis PHP 8.1 ; voir htmlspecialchars pour savoir quoi utiliser à la place.

Valider tout un formulaire avec filter_var_array

filter_var_array() applique un filtre par clé et renvoie un tableau avec chaque clé demandée : la valeur filtrée, false quand la validation a échoué, ou null quand la clé manquait.

role a disparu : les clés que vous n'avez pas listées sont abandonnées, ce qui empêche un visiteur d'ajouter role=admin à un formulaire et de le faire enregistrer. country vaut null car il n'a pas été envoyé. Sur un serveur web, filter_input_array(INPUT_POST, $rules) fait la même chose en lisant directement la requête.

Questions fréquentes

Comment valider une adresse email en PHP ?

Utilisez filter_var($email, FILTER_VALIDATE_EMAIL), qui renvoie la chaîne de l'email si elle est valide et false sinon : if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { /* invalid */ }. Elle ne vérifie que le format ; pour savoir si l'adresse existe, envoyez un email de confirmation.

Comment vérifier qu'une chaîne est un entier en PHP ?

filter_var($s, FILTER_VALIDATE_INT) renvoie l'entier pour "42", "-7" et " 42 ", et false pour "4.2", "42abc" ou "042". Comparez avec !== false, car un "0" valide renvoie 0, qui est évalué à faux.

Pourquoi filter_var renvoie-t-il false pour 0 ?

Ce n'est pas le cas : filter_var('0', FILTER_VALIDATE_INT) renvoie l'entier 0. Le bug est dans le test, if (filter_var(...)), qui traite 0 comme false. Écrivez if (filter_var($v, FILTER_VALIDATE_INT) !== false).

Qu'est-ce qui remplace FILTER_SANITIZE_STRING en PHP 8.1 ?

Rien directement ; il a été déprécié car son nom promettait une sécurité qu'il n'apportait pas. Validez la saisie que vous attendez, stockez-la telle quelle, et échappez-la à l'affichage avec htmlspecialchars(). S'il faut retirer les balises, utilisez strip_tags().

Quelle est la différence entre filter_var et filter_input ?

filter_var() filtre n'importe quelle valeur que vous lui passez. filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) lit directement la requête d'origine, elle renvoie donc null quand le paramètre manque et ignore toute modification faite par votre code à $_GET. Les deux prennent les mêmes filtres et options.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER