htmlspecialchars_decode()
Notre article porte sur la fonction PHP htmlspecialchars_decode(), utilisée pour convertir les entités HTML en leurs caractères correspondants.
La fonction htmlspecialchars_decode() fait l'inverse de htmlspecialchars() : elle reconvertit les cinq entités HTML spéciales (&, <, >, ", ') en leurs caractères littéraux (&, <, >, ", ').
Vous en avez généralement besoin lorsqu'une chaîne a déjà été encodée pour un affichage HTML sécurisé et que vous souhaitez retrouver les caractères bruts — par exemple, pour stocker le texte original, pour le comparer à une entrée non échappée, ou pour l'envoyer à un système qui attend un balisage littéral.
Cette page couvre la syntaxe, l'argument $flags et son effet sur les guillemets, la différence avec html_entity_decode(), ainsi qu'une mise en garde de sécurité à connaître avant de l'utiliser.
Syntaxe
htmlspecialchars_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401): string| Paramètre | Obligatoire | Description |
|---|---|---|
$string | Oui | La chaîne contenant les entités HTML à décoder. |
$flags | Non | Un masque de bits qui contrôle la gestion des guillemets et du type de document. |
La fonction retourne la chaîne décodée. Seules les entités produites par htmlspecialchars() sont converties — pour l'ensemble complet des entités HTML nommées et numériques, utilisez plutôt html_entity_decode().
Remarque : la valeur par défaut de
$flagsa changé en PHP 8.1, passant deENT_COMPAT | ENT_HTML401àENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401. Les exemples ci-dessous se comportent de manière identique dans les deux cas.
Exemple de base
Exemple de PHP htmlspecialchars_decode()
Dans cet exemple, nous avons une variable de type chaîne $html_string contenant du code HTML avec des entités. Nous utilisons la fonction htmlspecialchars_decode() pour convertir les entités HTML en leurs caractères correspondants.
Le résultat de ce code sera :
<h1>Hello World</h1>Les caractères < et > ont été restaurés à partir de < et >.
Contrôle des guillemets avec $flags
Le second argument, $flags, détermine quelles entités de guillemets sont décodées. Voici les valeurs les plus couramment utilisées :
| Indicateur | Effet sur les guillemets |
|---|---|
ENT_QUOTES | Décode à la fois les guillemets doubles (") et simples ('). |
ENT_COMPAT | Décode les guillemets doubles ; du côté du décodage, il décode également les guillemets simples. |
ENT_NOQUOTES | Laisse " et ' intacts. |
ENT_HTML5 | Traite l'entrée comme du HTML5 (à combiner avec un indicateur de guillemets, par ex. ENT_QUOTES | ENT_HTML5). |
Une source fréquente de confusion :
ENT_COMPATest souvent associé à « guillemets doubles uniquement », mais cette distinction ne s'applique qu'au côté encodage (htmlspecialchars()). Lors du décodage,'est converti avecENT_QUOTEScomme avecENT_COMPAT. Pour laisser les guillemets simples encodés, vous devez passerENT_NOQUOTES.
Comment utiliser PHP htmlspecialchars_decode() ?
Dans cet exemple, nous avons une variable de type chaîne $html_string contenant du code HTML avec des entités, dont un guillemet simple encodé. Nous utilisons la fonction htmlspecialchars_decode() avec l'indicateur ENT_QUOTES pour convertir les entités HTML en leurs caractères correspondants et pour gérer le guillemet simple.
Le résultat de ce code sera :
<p>I'm a paragraph</p>L'indicateur ENT_QUOTES a restauré le guillemet simple dans I'm ainsi que les chevrons.
htmlspecialchars_decode() vs html_entity_decode()
Les deux fonctions reconvertissent les entités en caractères, mais elles gèrent des ensembles différents :
htmlspecialchars_decode()décode uniquement les cinq entités créées parhtmlspecialchars():&,<,>,"et'. Elle est rapide et prévisible.html_entity_decode()décode l'intégralité de la table des entités HTML, y compris les entités nommées telles que©, et€, ainsi que les références numériques.
<?php
$text = "© 2024 & <Acme>";
// Leaves © untouched — it is not one of the five special chars
echo htmlspecialchars_decode($text); // © 2024 & <Acme>
echo "\n";
// Decodes © too
echo html_entity_decode($text); // © 2024 & <Acme>
?>Utilisez htmlspecialchars_decode() lorsque vous avez uniquement besoin d'inverser un appel à htmlspecialchars(). Recourez à html_entity_decode() lorsque le texte peut contenir des entités nommées comme © ou .
Mise en garde de sécurité
Le décodage transforme <script> en une balise <script> active. Ne jamais décoder une chaîne et l'afficher dans une page HTML sans la ré-échapper, sous peine de rouvrir une faille de cross-site scripting (XSS). Décodez pour le stockage, la comparaison ou une sortie hors HTML — et appelez à nouveau htmlspecialchars() avant de renvoyer quoi que ce soit au navigateur.
Fonctions associées
htmlspecialchars()— la contrepartie d'encodage de cette fonction.html_entity_decode()— décode toutes les entités HTML, pas seulement les cinq entités spéciales.htmlentities()— encode tous les caractères applicables en entités.strip_tags()— supprime entièrement les balises HTML au lieu de les décoder.