583 votes

htmlentities() vs. htmlspecialchars()

Quelles sont les différences entre htmlspecialchars() y htmlentities() . Quand dois-je utiliser l'un ou l'autre ?

388voto

MainMa Points 10849

htmlspecialchars peuvent être utilisés :

  1. Lorsqu'il n'est pas nécessaire de coder tous les caractères qui ont leurs équivalents HTML.

    Si vous savez que l'encodage de la page correspond aux symboles spéciaux du texte, pourquoi utiliser htmlentities ? htmlspecialchars est beaucoup plus simple, et produit moins de code à envoyer au client.

    Par exemple :

    echo htmlentities('<Il était une fois un être>.');
    // Output: &lt;Il &eacute;tait une fois un &ecirc;tre&gt;.
    //                ^^^^^^^^                 ^^^^^^^
    
    echo htmlspecialchars('<Il était une fois un être>.');
    // Output: &lt;Il était une fois un être&gt;.
    //                ^                 ^

    La seconde est plus courte et ne pose aucun problème si le jeu de caractères ISO-8859-1 est défini.

  2. Lorsque les données seront traitées non seulement par un navigateur (pour éviter de décoder les entités HTML),

  3. Si la sortie est XML (voir la réponse de Artefacto ).

5 votes

Htmlspecialchars($str, ENT_QUOTES, "UTF-8") est la meilleure solution si vous utilisez une version de PHP antérieure à 5.4. ENT_QUOTES est indispensable pour encoder les guillemets simples.

376voto

Thomas Owens Points 45042

Dans la documentation PHP de Identités html :

Cette fonction est identique à htmlspecialchars() dans tous les domaines, sauf avec htmlentities() tous les caractères qui ont des équivalents en entités de caractères HTML sont traduits dans ces entités.

Dans la documentation PHP de htmlspecialchars :

Certains caractères ont une signification particulière en HTML, et doivent être représentés par des entités HTML si l'on veut qu'ils conservent leur signification. Cette fonction renvoie une chaîne de caractères avec certaines de ces conversions effectuées ; les traductions effectuées sont celles qui sont les plus utiles pour la programmation Web quotidienne. Si vous souhaitez que toutes les entités de caractères HTML soient traduites, utilisez la fonction htmlentities() à la place.

La différence est ce qui est encodé. Les choix sont tout (entités) ou des caractères "spéciaux", comme l'esperluette, les guillemets doubles et simples, moins que et plus que (caractères spéciaux).

Je préfère utiliser htmlspecialchars dans la mesure du possible.

Par exemple :

    echo htmlentities('<Il était une fois un être>.');
    // Output: &lt;Il &eacute;tait une fois un &ecirc;tre&gt;.
    //                ^^^^^^^^                 ^^^^^^^

    echo htmlspecialchars('<Il était une fois un être>.');
    // Output: &lt;Il était une fois un être&gt;.
    //                ^                 ^

33 votes

Merci pour la réponse, mais pourriez-vous préciser ce que vous préférez ? htmlspecialchars() si possible, en dehors des différences évidentes ? Dans quelles situations l'utilisation de htmlentities() vous causer des problèmes alors que htmlspecialchars() ne le fera pas ?

19 votes

Je viens de rencontrer un problème dû à l'utilisation de htmlentities au lieu de htmlspecialchars ! Si votre site est encodé en UTF8, les symboles spéciaux comme ¡™£¢§¶ sont transformés en petits diamants noirs avec des points d'interrogation, car htmlentities ne sait pas comment les gérer, alors que htmlspecialchars le fait.

37 votes

@Darius Ce que vous dites n'a aucun sens. htmlentities y htmlspecialchars peuvent tous les deux gérer UTF-8 tant que vous spécifiez "UTF-8" pour le troisième argument.

107voto

Berky Points 57

Ceci est codé avec htmlentities .

implode( "\t", array_values( get_html_translation_table( HTML_ENTITIES ) ) ) :

" & < >
¡ ¢ £ ¤ ¥ ¦ § ¨ © ª " ¬ ® ¯ ° ± ² ³ ' µ ¶ - ¸ ¹ º " ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ Œ œ Š š Ÿ ƒ ˆ ˜ - - ' ' ' " " " † ‡ - ‰ ' ' € ™

Ceci est codé avec htmlspecialchars .

implode( "\t", array_values( get_html_translation_table( HTML_SPECIALCHARS ) ) ) :

" & < >

4 votes

Attention ! À première vue, htmlentities semble assez complet. Mais il lui manque un tas de caractères vraiment basiques et courants (surtout si vos clients aiment les MS). Les guillemets intelligents (par exemple, ' ou &rsquo ;), les tirets (par exemple, - ou &mdash), le signe de la marque déposée (™ ou &trade ;), et bien d'autres, lui feront renvoyer un résultat nul.

10 votes

@Jonathan Ceux-ci sont dans la liste. Si vous obtenez un résultat vide, c'est que vous avez probablement mal spécifié l'encodage.

4 votes

Ou bien vous n'avez pas spécifié l'encodage, et vous vous êtes fié à la valeur par défaut, qui a changé en PHP 5.4, puis (peut-être) à nouveau en PHP 5.6, selon votre configuration. Jusqu'en 2012, la documentation ne recommandait même pas de spécifier ce paramètre. Donc, si vous ne spécifiez pas le paramètre en option troisième paramètre, et en mettant à jour PHP, htmlentities utilise d'abord ISO-8859-1, puis UTF-8, et enfin ce qui est dans votre php.ini, sans lancer d'erreur, mais en retournant tranquillement rien. Il est clair que cela ne pourrait jamais conduire à une perte de données à un moment donné !

98voto

Artefacto Points 50896

Parce que :

  • Parfois, vous écrivez des données XML, et vous ne pouvez pas utiliser d'entités HTML dans un fichier XML.
  • Parce que htmlentities substitue plus de caractères que htmlspecialchars . C'est inutile, cela rend le script PHP moins efficace et le code HTML résultant moins lisible.

htmlentities n'est nécessaire que si vos pages utilisent des encodages tels que ASCII ou LATIN-1 au lieu de UTF-8 et que vous traitez des données avec un encodage différent de celui de la page.

14voto

Eric Hogue Points 2655

Je viens de découvrir le get_html_translation_table fonction. Vous lui passez HTML_ENTITIES o HTML_SPECIALCHARS et renvoie un tableau contenant les caractères qui seront encodés et la manière dont ils seront encodés.

4 votes

Ceci est utile lorsque vous souhaitez créer votre propre fonction, par exemple pour remplacer certains caractères supplémentaires ou faire d'autres choses magiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X