Validation de formulaires PHP : URL et E-mail
Apprenez à valider les champs e-mail et URL en PHP avec filter_var et les expressions régulières pour sécuriser vos formulaires web.
L'e-mail et l'URL sont deux des champs les plus courants dans tout formulaire web, et ce sont aussi deux des plus faciles à mal saisir pour les utilisateurs. Une faute de frappe comme user@example (domaine de premier niveau manquant) ou example.com (une URL sans schéma) passera un simple contrôle « est-ce non vide » mais échouera dès que votre application tentera d'envoyer un message ou de suivre le lien.
Ce chapitre montre comment valider les champs e-mail et URL en PHP — en vérifiant qu'une valeur a la forme attendue avant de la stocker ou de l'utiliser. La validation est une étape dans un flux plus large qui comprend également la collecte des données depuis $_POST/$_GET, leur nettoyage et leur assainissement ; consultez PHP Form Handling et PHP Form Validation pour une vue d'ensemble complète.
Nous couvrons deux approches : la fonction intégrée filter_var (recommandée) et les expressions régulières (utiles à comprendre, parfois nécessaires pour des règles personnalisées).
Validation des champs e-mail
La manière la plus simple de valider une adresse e-mail en PHP est la fonction filter_var avec le filtre FILTER_VALIDATE_EMAIL. Elle renvoie la valeur filtrée si la chaîne ressemble à un e-mail valide, et false dans le cas contraire — elle s'associe donc naturellement à un test if :
Comme filter_var renvoie false (et non null) pour une entrée invalide, comparez toujours avec ! (vague) ou === false (strict). Un bug courant consiste à écrire if (filter_var($email, FILTER_VALIDATE_EMAIL) == false) pour une adresse comme 0, ce qui fonctionne dans ce cas, mais préférez en général === false pour éviter les surprises liées à la comparaison souple de PHP.
Validation de l'e-mail avec une expression régulière
Vous pouvez également valider un e-mail avec une expression régulière — un motif décrivant quelles chaînes sont autorisées — en utilisant preg_match. Cela vaut la peine d'être connu, mais n'y recourez que lorsque vous avez besoin d'une règle que filter_var ne peut pas exprimer (par exemple, restreindre à un seul domaine d'entreprise) :
Remarque : Préférez
FILTER_VALIDATE_EMAILà une expression régulière écrite à la main en production. La spécification complète des e-mails (RFC 5322) est notoirement difficile à capturer avec un seul motif, et l'expression régulière ci-dessus rejettera des adresses parfaitement valides comme les domaines de premier niveau longs (.museum) ou les adresses taguées avec+([email protected]). Consultez PHP Regular Expressions si vous souhaitez approfondir la syntaxe des motifs.
Validation des champs URL
Les URL sont validées de la même façon, avec filter_var et le filtre FILTER_VALIDATE_URL. Un détail important : le filtre exige un schéma (http://, https://, ftp://, …). Un simple example.com ou www.example.com est signalé comme invalide, donc décidez en amont si votre formulaire attend que les utilisateurs saisissent le préfixe https://.
FILTER_VALIDATE_URL accepte des drapeaux supplémentaires pour affiner la règle — par exemple, FILTER_FLAG_PATH_REQUIRED (l'URL doit contenir un chemin après l'hôte) ou FILTER_FLAG_QUERY_REQUIRED (elle doit contenir une chaîne de requête) :
<?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";
}
?>Validation d'une URL avec une expression régulière
Comme pour l'e-mail, vous pouvez faire correspondre une URL avec une expression régulière. Le motif ci-dessous est permissif et doit être considéré comme un outil d'apprentissage plutôt que comme une règle de production :
Remarque : Pour l'e-mail comme pour l'URL, les filtres intégrés de
filter_varsont le choix recommandé. Ils sont maintenus avec PHP, couvrent les cas limites que les expressions régulières manquent, et sont bien plus lisibles dans votre code.
Assemblage dans un formulaire complet
Dans un vrai formulaire, vous ne travaillez pas avec des chaînes codées en dur — vous lisez les valeurs soumises depuis le superglobal $_POST, vous les nettoyez et vous collectez les erreurs afin de les afficher toutes en même temps. Cet exemple valide un e-mail obligatoire et un site web optionnel :
<?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);
}
?>L'opérateur de fusion null ?? "" évite un avertissement quand le champ est absent, et le test $website !== "" rend l'URL optionnelle. C'est le même motif utilisé dans PHP Form Required Fields.
Validation vs. assainissement
La validation répond à la question « cette valeur a-t-elle la bonne forme ? » — elle ne supprime ni n'échappe les caractères dangereux. L'assainissement fait cela. PHP expose des filtres d'assainissement tels que FILTER_SANITIZE_EMAIL, qui supprime les caractères non autorisés dans une adresse e-mail :
<?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";
}
?>Ici, l'assainissement transforme user(at)example.com en useratexample.com, qui échoue ensuite à la validation — c'est exactement le bon résultat, puisque l'original n'était pas une vraie adresse. En règle générale : validez pour accepter ou rejeter, assainissez avant la sortie, et ne faites jamais confiance aux données d'un formulaire. Pour l'échappement des données à destination du HTML ou d'une base de données, consultez htmlspecialchars et mysqli::real_escape_string.
Résumé
- Utilisez
filter_var($value, FILTER_VALIDATE_EMAIL)etfilter_var($value, FILTER_VALIDATE_URL)pour une validation fiable et lisible. FILTER_VALIDATE_URLexige un schéma tel quehttps://; ajoutez des drapeaux commeFILTER_FLAG_PATH_REQUIREDpour affiner la règle.- Les expressions régulières peuvent aussi valider ces formats, mais elles sont faciles à mal écrire — préférez les filtres intégrés.
- La validation et l'assainissement sont deux tâches distinctes ; utilisez les deux et traitez toutes les données soumises comme non fiables.