# sanitize_email avant is_email : deux fonctions qu’on confond trop souvent

> Nettoyer une adresse email et valider qu'elle est correctement formée sont deux opérations distinctes, que WordPress sépare volontairement en deux fonctions.

- Auteur : WordPress Développement
- Publié le : 2024-03-12
- Mis à jour le : 2024-03-12
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/sanitize-email-avant-is-email/

## L’essentiel

- sanitize_email() retire les caractères invalides d'une chaîne
- is_email() vérifie que le résultat respecte le format d'une adresse valide
- Les deux fonctions se complètent, l'une ne remplace jamais l'autre

| Fonction | Rôle | Résultat renvoyé |
| --- | --- | --- |
| sanitize_email() | Retirer les caractères non autorisés dans une adresse email | Une chaîne nettoyée, potentiellement toujours invalide |
| is_email() | Vérifier que la chaîne respecte le format d'une adresse valide | L'adresse elle-même si valide, sinon `false` |

Un formulaire d'inscription accepte une valeur du type `contact@@example..com` sans broncher, simplement parce que le développeur a appliqué `sanitize_email()` sur la saisie et s'est arrêté là, en pensant que cette étape suffisait à garantir une adresse exploitable.

Ce n'est pourtant pas le rôle de `sanitize_email()`. Comme la plupart des fonctions de la famille `sanitize_*` dans WordPress, elle se contente de retirer les caractères qui n'ont structurellement rien à faire dans le type de donnée visé, sans se prononcer sur la validité globale de la chaîne obtenue.

## Ce que sanitize_email() retire réellement

`sanitize_email()` parcourt la chaîne fournie et ne conserve que les caractères autorisés dans une adresse email selon la spécification (lettres, chiffres, et un ensemble précis de caractères spéciaux comme le point, le tiret, l'arobase, le trait de soulignement). Elle retire donc les espaces, les balises HTML éventuellement présentes, et tout caractère qui ne pourrait de toute façon pas apparaître dans une adresse email légitime :

```
echo sanitize_email( 'contact @ example.com' );
// contact@example.com (espaces retirés)

echo sanitize_email( 'contact@@example..com' );
// contact@@example..com (rien à retirer : tous les caractères sont "autorisés")
```

Le second exemple illustre précisément la limite de la fonction : une double arobase et un double point restent des caractères valides pris individuellement, alors que leur combinaison ne forme jamais une adresse email correcte. `sanitize_email()` n'a aucun moyen de le détecter, ce n'est simplement pas sa mission.

## is_email() pour valider le format

> L'essentiel à retenir : sanitize_email() retire les caractères invalides d'une chaîne ; is_email() vérifie que le résultat respecte le format d'une adresse valide ; Les deux fonctions se complètent, l'une ne remplace jamais l'autre

`is_email()` prend le relais exactement là où `sanitize_email()` s'arrête. Elle vérifie la structure complète de l'adresse — présence d'une seule arobase, partie locale et domaine non vides, domaine contenant au moins un point suivi d'une extension plausible — et renvoie l'adresse elle-même si elle est valide, ou `false` dans le cas contraire :

```
function traiter_inscription_newsletter( $email_saisi ) {
    $email = sanitize_email( $email_saisi );

    if ( ! is_email( $email ) ) {
        return new WP_Error(
            'email_invalide',
            "L'adresse email saisie n'est pas valide."
        );
    }

    return $email;
}
```

Cet enchaînement — nettoyer, puis valider — reste la seule combinaison fiable. Sanitizer seul laisse passer des adresses mal formées ; valider seul, sans sanitizer avant, expose `is_email()` à des espaces ou des caractères parasites qui peuvent fausser son verdict selon leur position dans la chaîne.

## Un filtre disponible sur is_email()

`is_email()` déclenche le filtre `is_email`, qui reçoit le résultat de la validation ainsi que l'adresse d'origine et le contexte de vérification. Ce filtre permet, dans de rares cas, d'ajuster la logique de validation à des besoins spécifiques d'un projet, par exemple pour refuser explicitement certains domaines connus pour générer des adresses jetables :

```
add_filter( 'is_email', function ( $adresse_validee, $adresse_originale ) {
    if ( $adresse_validee && str_ends_with( $adresse_validee, '@domaine-interdit.example' ) ) {
        return false;
    }

    return $adresse_validee;
}, 10, 2 );
```

## Ce que ni l'une ni l'autre ne garantissent

- Aucune des deux fonctions ne vérifie que l'adresse existe réellement ou qu'elle appartient bien à la personne qui l'a saisie.
- Aucune ne détecte les adresses jetables ou temporaires, un besoin qui nécessite une liste de domaines à comparer séparément.
- La seule façon de confirmer qu'une adresse est réellement exploitable reste l'envoi d'un email de confirmation avec un lien à activer.

Sur un formulaire d'inscription, cette confirmation par email reste donc une étape complémentaire indispensable, que la validation du format ne remplace jamais entièrement.

> Sur tout champ email d'un formulaire, enchaîner systématiquement `sanitize_email()` puis `is_email()` avant d'enregistrer quoi que ce soit évite bien des adresses invalides qui polluent silencieusement une base de contacts.

## En résumé

Nettoyer n'est pas valider, et les deux fonctions répondent chacune à une question différente : `sanitize_email()` retire ce qui ne peut structurellement pas appartenir à une adresse email, `is_email()` confirme que ce qui reste forme bien une adresse cohérente. Les utiliser dans cet ordre, systématiquement, évite la plupart des mauvaises surprises.
