web-dev-qa-db-fra.com

Quels caractères doivent être échappés en HTML 5?

HTML 4 indique assez quels caractères devrait être échappé:

Les références d'entité à quatre caractères méritent une mention spéciale car elles sont fréquemment utilisées pour échapper aux caractères spéciaux:

  • "lt;" représente le signe <.
  • "gt;" représente le signe>.
  • "amp;" représente le signe.
  • "quot; représente la marque".

Les auteurs souhaitant mettre le caractère "<" dans le texte doivent utiliser "lt;" (ASCII décimal 60) pour éviter toute confusion possible avec le début d'une balise (start tag open delimiter). De même, les auteurs devraient utiliser "gt;" (ASCII décimal 62) dans le texte au lieu de ">" pour éviter les problèmes avec les agents utilisateurs plus anciens qui perçoivent incorrectement cela comme la fin d'une balise (délimiteur de fermeture de balise) lorsqu'elle apparaît dans les valeurs d'attribut citées.

Les auteurs doivent utiliser "amp;" (ASCII décimal 38) au lieu de "" pour éviter toute confusion avec le début d'une référence de caractère (délimiteur ouvert de référence d'entité). Les auteurs doivent également utiliser "amp;" dans les valeurs d'attribut car les références de caractères sont autorisées dans les valeurs d'attribut CDATA.

Certains auteurs utilisent la référence d'entité de caractère "quot;" pour coder les instances du guillemet double (") car ce caractère peut être utilisé pour délimiter les valeurs d'attribut.

Je suis surpris de ne rien trouver de tel dans HTML 5. Avec l'aide de grep, la seule mention non XML que j'ai pu trouver vient en aparté concernant l'élément XMP obsolète :

Utilisez à la place pre et code et échappez les caractères "<" et "" sous la forme "lt;" et "amp;" respectivement.

Pourrait un peu indiquer la source officielle à ce sujet?

20
ezequiel-garzon

la spécification définit la syntaxe des éléments normaux comme:

Les éléments normaux peuvent avoir du texte, des références de caractères, d'autres éléments et des commentaires, mais le texte ne doit pas contenir le caractère U + 003C MOINS (<) ou une esperluette ambiguë. Certains éléments normaux ont également encore plus de restrictions sur le contenu qu'ils sont autorisés à contenir, au-delà des restrictions imposées par le modèle de contenu et celles décrites dans ce paragraphe. Ces restrictions sont décrites ci-dessous.

Vous devez donc vous échapper <, ou & lorsqu'il est suivi de tout ce qui pourrait commencer une référence de caractère . La règle sur les esperluettes est la seule règle de ce type pour les attributs entre guillemets, car le guillemet correspondant est la seule chose qui en terminera un. (Évidemment, si vous ne souhaitez pas y mettre fin à la valeur d'attribut, échappez au guillemet.)

Ces règles ne s'appliquent pas à <script> et <style>; vous devez éviter d'y mettre du contenu dynamique. (Si vous devez inclure JSON dans un <script>, remplacez < avec \x3c, le caractère U + 2028 avec \u2028 et U + 2029 avec \u2029 après la sérialisation JSON.)

8
Ry-

De http://www.w3.org/html/wg/drafts/html/master/single-page.html#serializing-html-fragments

Échapper une chaîne (pour les besoins de l'algorithme * ci-dessus) consiste à exécuter les étapes suivantes:

  1. Remplacez toute occurrence du caractère "" par la chaîne "amp;".
  2. Remplacez toutes les occurrences du caractère U + 00A0 NO-BREAK SPACE par la chaîne "nbsp;".
  3. Si l'algorithme a été appelé en mode attribut, remplacez toutes les occurrences du caractère "" "par la chaîne" quot; ".
  4. Si l'algorithme n'a pas été invoqué en mode attribut, remplacez toutes les occurrences du caractère "<" par la chaîne "lt;" et toutes les occurrences du caractère ">" par la chaîne "gt;".

* Algorithm est l'algorithme de sérialisation intégré comme appelé par ex. par le getter innerHTML.

À strictement parler, ce n'est pas exactement une réponse à votre question, car il s'agit de sérialisation plutôt que d'analyse. Mais d'un autre côté, la sortie sérialisée est conçue pour être analysée en toute sécurité. Donc, implicitement, lors de l'écriture du balisage:

  1. Le & le caractère doit être remplacé par &amp;
  2. Les espaces insécables doivent être échappés par &nbsp; (surprise! ...)
  3. Dans les attributs, " doit être échappé par &quot;
  4. En dehors des attributs, < doit être échappé par &lt; et > doit être échappé par &gt;

J'écris intentionnellement "devrait", pas "doit", car les analyseurs peuvent être en mesure de corriger les violations de ce qui précède.

4
user123444555621

Ajouter ma voix pour insister sur le fait que les choses ne sont pas si simples - à proprement parler:

Cas 1: sérialisation HTML

(le plus courant)

Si vous sérialisez votre HTML5 en HTML, "le texte ne doit pas contenir le caractère U + 003C MOINS QUE LE SIGNE (<) ou une esperluette ambiguë."

Une esperluette ambiguë est une "esperluette suivie d'un ou de plusieurs caractères alphanumériques ASCII caractères, suivie d'un caractère U + 003B SEMICOLON (;)")

De plus, "l'analyse de certaines références de caractères nommées dans les attributs se produit même si le point-virgule de fermeture est omis."

Donc, dans ce cas editable && copy (notez les espaces autour de &&) est un HTML5 valide sérialisé en construction HTML car aucune des esperluettes n'est suivie d'une lettre.

Comme contre-exemple: editable&&copy n'est pas sûr (même si cela pourrait fonctionner) comme la dernière séquence &copy peut être interprété comme la référence d'entité pour ©

Cas 1: sérialisation XML

(le moins fréquent)

Ici, les règles XML classiques s'appliquent. Par exemple, chaque esperluette dans le texte ou dans les attributs doit être échappée par &amp;.

Dans ce cas && (avec ou sans espaces) n'est pas du XML valide. Vous devez écrire &amp;&amp;

Tricky, n'est-ce pas?

3
Sylvain Leroux