583 votes

Htmlentities() vs. htmlspecialchars()

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

388voto

MainMa Points 10849

htmlspecialchars peut être utilisé :

  1. Lorsqu'il n'est pas nécessaire d'encoder 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 utiliseriez-vous htmlentities? htmlspecialchars est beaucoup plus direct, et produit moins de code à envoyer au client.

    Par exemple:

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

    Le deuxième est plus court, 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 à travers un navigateur (pour éviter le décodage des entités HTML),

  3. Si la sortie est du XML (voir la réponse d'Artefacto).

5 votes

Htmlspecialchars($str, ENT_QUOTES, "UTF-8") est le meilleur 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

De la documentation PHP pour htmlentities:

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

De la documentation PHP pour htmlspecialchars:

Certains caractères ont une signification spéciale en HTML et doivent être représentés par des entités HTML s'ils doivent conserver leur signification. Cette fonction renvoie une chaîne avec certaines de ces conversions effectuées ; les traductions effectuées sont celles les plus utiles pour la programmation web quotidienne. Si vous avez besoin que toutes les entités de caractères HTML soient traduites, utilisez plutôt htmlentities().

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

Je préfère utiliser htmlspecialchars chaque fois que possible.

Par exemple:

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

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

33 votes

Merci pour la réponse, mais pourriez-vous développer sur votre préférence pour htmlspecialchars() autant que possible, en dehors des différences évidentes? Dans quels cas l'utilisation de htmlentities() vous posera des problèmes alors que htmlspecialchars() ne le fera pas?

19 votes

Je viens de rencontrer un problème en utilisant htmlentities au lieu de htmlspecialchars ! Si votre site est encodé en UTF8, des 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, mais htmlspecialchars le sait.

37 votes

@Darius Ce que tu dis n'a aucun sens. htmlentities et htmlspecialchars peuvent tous deux traiter l'UTF-8 tant que vous spécifiez "UTF-8" pour le troisième argument.

107voto

Berky Points 57

Cela est encodé avec htmlentities.

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

" & < >
¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ Œ œ Š š Ÿ ƒ ˆ ˜ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϑ ϒ ϖ       ‌ ‍ ‎ ‏ – — ‘ ’ ‚ “ ” „ † ‡ • … ‰ ′ ″ ‹ › ‾ ⁄ € ℑ ℘ ℜ ™ ℵ ← ↑ → ↓ ↔ ↵ ⇐ ⇑ ⇒ ⇓ ⇔ ∀ ∂ ∃ ∅ ∇ ∈ ∉ ∋ ∏ ∑ − ∗ √ ∝ ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∴ ∼ ≅ ≈ ≠ ≡ ≤ ≥ ⊂ ⊃ ⊄ ⊆ ⊇ ⊕ ⊗ ⊥ ⋅ ⌈ ⌉ ⌊ ⌋ ⟨ ⟩ ◊ ♠ ♣ ♥ ♦

Cela est encodé avec htmlspecialchars.

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

" & < >

4 votes

Faites attention! À première vue, htmlentities semble assez complet. Mais il manque un tas de caractères très basiques et communs (surtout si vos clients utilisent MS). Les guillemets intelligents (par exemple, ’ ou ’), les tirets (par exemple, — ou —), le signe de marque (™ ou ™), et bien d'autres causeront sa nullité.

10 votes

@Jonathan ceux-ci sont dans la liste. Si vous obtenez un résultat vide, vous avez probablement spécifié incorrectement l'encodage.

4 votes

Ou vous n'avez pas spécifié l'encodage, et vous avez compté sur la valeur par défaut, qui a changé en PHP 5.4, et ensuite (éventuellement) à nouveau en PHP 5.6, selon votre configuration. Jusqu'en 2012, la documentation ne recommandait même pas de spécifier le paramètre. Donc, si vous n'avez pas spécifié le troisième paramètre facultatif, et mis à jour PHP, htmlentities utilisait d'abord ISO-8859-1, puis utilisait UTF-8, puis utilisait ce qui se trouve dans votre php.ini, sans générer d'erreur pour les problèmes, mais renvoyant silencieusement rien à la place. Clairement, cela ne pourrait jamais conduire à une perte de données à un certain moment !

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. Cela est inutilement, rend le script PHP moins efficace et le code HTML résultant moins lisible.

htmlentities est seulement nécessaire 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 la fonction get_html_translation_table. Vous lui passez HTML_ENTITIES ou HTML_SPECIALCHARS et il renvoie un tableau avec les caractères qui seront encodés et comment ils seront encodés.

4 votes

Il est utile lorsque vous voulez 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