htmlentities() vs htmlspecialchars() : le combat des fonctions PHP

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

htmlentities() vs. htmlspecialchars() : guide détaillé avec exemples

\n\n

Vous êtes-vous déjà demandé pourquoi PHP a deux fonctions qui font, semble-t-il, la même chose ? htmlentities() et htmlspecialchars() sont comme deux frères jumeaux : semblables en apparence, mais avec des caractères différents. Et le choix entre elles peut devenir soit une compétence de super-héros, soit une source de maux de tête.

\n\n

Si vous avez déjà posé cette question sur Stack Overflow (et ils sont des milliers !), vous savez que la réponse n'est pas toujours évidente. Aujourd'hui, nous allons une fois pour toutes comprendre à quoi sert chaque fonction, quand les utiliser, et comment ne pas se tromper avec les encodages.

\n\n

C'est parti !

\n\n

Que font exactement ces fonctions ?

\n\n

Les deux fonctions sont conçues pour l'échappement des caractères HTML. En termes simples : elles transforment les caractères spéciaux en leurs entités HTML, afin que le navigateur les affiche comme du texte et ne les interprète pas comme du code.

\n\n

Par exemple, le caractère < se transforme en &lt;. Ceci est crucial pour :

\n
    \n
  • La sécurité — protection contre les attaques XSS (cross-site scripting)
  • \n
  • L'affichage correct — pour que votre texte ne « casse » pas le balisage HTML
  • \n
\n\n

Mais voici le piège : htmlspecialchars() ne fonctionne qu'avec quatre caractères, tandis que htmlentities() fonctionne avec toutes les entités HTML connues.

\n\n

htmlspecialchars() : l'artillerie légère

\n\n

La fonction htmlspecialchars() ne transforme que ces caractères :

\n
    \n
  • & (esperluette) → &amp;
  • \n
  • " (guillemet double) → &quot; (si le drapeau ENT_NOQUOTES n'est pas défini)
  • \n
  • ' (guillemet simple) → &#039; (si le drapeau ENT_QUOTES est défini)
  • \n
  • < (inférieur) → &lt;
  • \n
  • > (supérieur) → &gt;
  • \n
\n\n

Cet ensemble est suffisant dans 99% des cas. Pourquoi ? Parce que seuls ces caractères ont une signification spéciale dans le balisage HTML et peuvent casser votre page.

\n\n
<?php\n$user_input = '<script>alert("XSS")</script>';\necho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');\n// Affichera : &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;\n?>
\n\n

htmlentities() : la cavalerie lourde

\n\n

htmlentities() est ce perfectionniste qui transforme en entités tous les caractères ayant un équivalent HTML. Par exemple, les symboles monétaires (€, £, ¥), les signes mathématiques (∑, ∞, √) et même les flèches (←, ↑).

\n\n
<?php\n$text = 'Prix : 50€';\necho htmlentities($text, ENT_QUOTES, 'UTF-8');\n// Affichera : Prix : 50&euro;\n?>
\n\n

Cela semble pratique, n'est-ce pas ? Mais il y a un hic — la performance. htmlentities() est plus lente car elle traite plus de caractères. Et si votre site traite des milliers de lignes, la différence devient notable.

\n\n

La différence clé : l'encodage

\n\n

Et c'est ici que nous arrivons au point le plus important. Les deux fonctions acceptent un troisième paramètre — l'encodage. Et si vous ne le spécifiez pas, PHP utilisera la valeur de la directive default_charset dans php.ini (généralement UTF-8).

\n\n

Mais htmlentities() est particulièrement sensible à l'encodage. Si vous spécifiez un mauvais encodage, la fonction peut transformer les caractères de manière incorrecte. Par exemple, avec ISO-8859-1, certains caractères UTF-8 seront perdus.

\n\n
<?php\n// Mauvais exemple : encodage non spécifié\necho htmlentities('Bonjour, le monde !'); // Peut générer un avertissement\n\n// Bon exemple : spécifiez toujours l'encodage\necho htmlentities('Bonjour, le monde !', ENT_QUOTES, 'UTF-8');\n?>
\n\n

Quand utiliser quoi ?

\n\n

Blogs

Book Recommendations