W3docs

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 (&amp;, &lt;, &gt;, &quot;, &#039;) 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ètreObligatoireDescription
$stringOuiLa chaîne contenant les entités HTML à décoder.
$flagsNonUn 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 $flags a changé en PHP 8.1, passant de ENT_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()

php— editable, runs on the server

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 &lt; et &gt;.

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 :

IndicateurEffet sur les guillemets
ENT_QUOTESDécode à la fois les guillemets doubles (&quot;) et simples (&#039;).
ENT_COMPATDécode les guillemets doubles ; du côté du décodage, il décode également les guillemets simples.
ENT_NOQUOTESLaisse &quot; et &#039; intacts.
ENT_HTML5Traite 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_COMPAT est souvent associé à « guillemets doubles uniquement », mais cette distinction ne s'applique qu'au côté encodage (htmlspecialchars()). Lors du décodage, &#039; est converti avec ENT_QUOTES comme avec ENT_COMPAT. Pour laisser les guillemets simples encodés, vous devez passer ENT_NOQUOTES.

Comment utiliser PHP htmlspecialchars_decode() ?

php— editable, runs on the server

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 par htmlspecialchars() : &amp;, &lt;, &gt;, &quot; et &#039;. 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 &copy;, &nbsp; et &euro;, ainsi que les références numériques.
<?php
$text = "&copy; 2024 &amp; &lt;Acme&gt;";

// Leaves &copy; untouched — it is not one of the five special chars
echo htmlspecialchars_decode($text);   // &copy; 2024 & <Acme>
echo "\n";

// Decodes &copy; 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 &copy; ou &nbsp;.

Mise en garde de sécurité

Le décodage transforme &lt;script&gt; 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.

Pratique

Pratique
Quel est le rôle de la fonction htmlspecialchars_decode() en PHP ?
Quel est le rôle de la fonction htmlspecialchars_decode() en PHP ?
Was this page helpful?