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

HTML 4 déclare pretty caractères devrait être échappé:

les références à des entités à quatre caractères méritent une mention spéciale puisqu'elles sont fréquemment utilisés pour échapper les caractères spéciaux:

  • "<" représente le < signe.
  • ">" représente le signe>.
  • "&" représente le signe&.
  • "" représente la " marque.

auteurs souhaitant pour mettre le caractère "<" dans le texte devrait utiliser " " (ASCII décimal 62) dans le texte au lieu de " > " pour éviter les problèmes avec les agents utilisateurs plus âgés mal perçoivent cela comme la fin d'une balise (tag fermer délimiteur) lorsqu'il apparaît dans les valeurs d'attribut citées.

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

certains auteurs utilisent la référence d'entité de caractère "" pour encoder les cas de double guillemet ( " ) puisque ce caractère peut être utilisé pour délimiter les valeurs d'attribut.

je suis surpris que je ne trouve rien de ce genre dans HTML 5. Avec l'aide de grep la seule mention non-XML J'ai pu trouver vient comme un aparté concernant l'élément XMP déprécié:

utilisez pre et code à la place, et échappez les caractères " < " et " & "comme" < " et " & " respectivement.

est-ce que la source officielle pourrait être mentionnée à ce sujet?

18
demandé sur ezequiel-garzon 2014-09-01 23:48:30

3 réponses

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 que le signe (<) ou une esperluette ambiguë. Certains éléments normaux ont aussi 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. Ceux les restrictions sont décrites ci-dessous.

vous devez donc vous échapper <, ou & lorsqu'il est suivi par tout ce qui pourrait commencer une référence de caractère. La règle sur les ampersands est la seule règle de ce genre pour les attributs cotés, car le guillemet correspondant est la seule chose qui en résoudra un. (Évidemment, si vous ne voulez pas y supprimer la valeur de l'attribut, évitez le guillemet.)

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

6
répondu Ry- 2017-07-06 04:20:07

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

Échapper à une chaîne de caractères (pour l'application de l'algorithme* ci-dessus) se compose de l'exécution de la procédure suivante:

  1. Remplacer toutes les occurrences du caractère "&" par la chaîne "&".
  2. remplacer toute occurrence du caractère U+00A0 NO-BREAK SPACE par la chaîne"".
  3. si la l'algorithme a été invoqué dans le mode attribut, remplacer tous les occurrences du caractère ""par la chaîne de caractères"".
  4. si l'algorithme n'a pas été invoqué en mode attribut, remplacer toute occurrence du caractère " < " par la chaîne de caractères "<", et toute occurrences du caractère > par la chaîne de caractères ">".

*Algorithme est l'algorithme de sérialisation intégré appelé par exemple par innerHTML getter.

à proprement parler, ce n'est pas vraiment une réponse à votre question, puisqu'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 séparable en toute sécurité. Donc, par voie de conséquence, lors de l'écriture de syntaxe:

  1. & le caractère doit être remplacé par &amp;
  2. les espaces insécables doivent être échappés &nbsp; (surprise!...)
  3. Dans les attributs, " devrait être échappé que &quot;
  4. à l'Extérieur de attributs, < devrait être échappé que &lt; et > devrait être échappé que &gt;

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

4
répondu user123444555621 2016-10-09 21:50:00

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

Cas 1 : HTML sérialisation

(le plus commun)

si vous sérialisez votre HTML5 en HTML, "le texte ne doit pas contenir le caractère U+003C LESS-THAN SIGN ( < ) ou un ambigu esperluette."

ambigu esperluette est un "ampersand suivi d'un ou plusieurs caractères ASCII alphanumériques, suivi D'un caractère U+003B point-virgule (;)"

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

Donc, dans ce cas editable && copy (noter les espaces autour de&&) est valide HTML5 sérialisé comme la construction HTML car aucun de l'esperluette est suivi par 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 de l'entité pour ©

Cas 1 : la sérialisation XML

(moins fréquent)

ici, les règles XML classiques s'appliquent. Par exemple, chaque esperluette soit dans le texte ou dans les attributs doivent être échappés &amp;.

Dans ce cas && (avec ou sans espaces) est invalide XML. Vous devriez écrire &amp;&amp;

délicat, n'est-ce pas ?

3
répondu Sylvain Leroux 2015-12-17 13:02:54