Какие символы должны быть экранированы в HTML 5?

HTML-код 4 государства-очень какие символы следует избежать:

четыре ссылки на сущности символов заслуживают особого упоминания, поскольку они часто используются для избежания специальных символов:

  • "
  • ">" представляет знак>.
  • "&" представляет & знак.
  • "" представляет знак".

авторы, желающие чтобы поместить символ " " (ASCII decimal 62) в тексте вместо">", чтобы избежать проблем со старыми агентами пользователей что неправильно воспринимают это как конец тега (tag close разделитель), когда он появляется в кавычках значений атрибутов.

авторы должны использовать " & "(ASCII decimal 38) вместо"&", чтобы избежать путаница с началом характеристику (сущность ссылка открыть разделитель). Авторы также должны использовать " & " в значения атрибутов, поскольку ссылки на символы разрешены в CDATA значение атрибута.

некоторые авторы используют ссылку на сущность символа """ для кодирования экземпляры двойной кавычки ( " ), так как этот символ может быть используется для разграничения значений атрибутов.

Я удивлен, что не могу найти ничего подобного в HTML 5. С помощью grep единственное упоминание не XML Я мог бы найти приходит как в сторону относительно устаревший элемент XMP:

вместо этого используйте pre и code и escape "

может ли что-то указать на официальный источник по этому вопросу?

3 ответов


на спецификация определяет синтаксис для обычных элементов as:

обычные элементы могут иметь текст, ссылки на символы, другие элементы и комментарии, но текст не должен содержать символ U+003C меньше, чем знак (

таким образом, вы должны бежать < или & на все, что может начать ссылку на символ. Правило амперсандов является единственным таким правилом для цитируемых атрибутов, так как соответствующая кавычка является единственной вещью, которая завершит один. (Очевидно, что если вы не хотите завершать значение атрибута там, избегайте кавычки.)

эти правила не применяются к <script> и <style>; вы должны избегать размещения динамического контента в них. (Если вы обязательно включить JSON в <script> заменить < с \x3c, символ U + 2028 с \u2028 и U+2029 с \u2029 после сериализации JSON.)


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

Побег из строки (для целей алгоритма* выше) состоит выполнения следующих шагов:

  1. замените любое вхождение символа " & "строкой"&".
  2. замените все вхождения символа пробела без перерыва U+00A0 строкой " ".
  3. если алгоритм был вызван в атрибутивном режиме, замените любые вхождения символа ""на строку"".
  4. если алгоритм не был вызван в атрибутивном режиме, замените любые вхождения символа " "по строке">".

*алгоритм - это встроенный алгоритм сериализации, называемый, например,innerHTML геттер.

строго говоря, это не совсем ответ на ваш вопрос, поскольку он касается сериализации, а не разбор. Но, с другой стороны, сериализованный вывод предназначен для безопасного синтаксического анализа. Итак, подразумеваем, при написании разметки:

  1. на & символ должен быть заменен на &amp;
  2. неразрывные пробелы должны быть экранированы как &nbsp; (сюрприз!...)
  3. в атрибутах " должен быть экранирован как &quot;
  4. внешних атрибутов, < следует избегать как &lt; и > следует избегать как &gt;

Я намеренно пишу "должен", а не" должен", поскольку Парсеры могут исправить нарушения вышеизложенного.


добавив мой голос, чтобы настаивать, что все не так просто - строго говоря:

Случай 1: сериализация HTML

(наиболее распространенные)

если вы сериализуете HTML5 как HTML, " текст не должен содержать символа U+003C меньше знака (

неоднозначный амперсанд-это "амперсанд, за которым следует один или несколько буквенно-цифровых символов ASCII, а затем символ точки с запятой U+003B (;)"

кроме того, " синтаксический анализ некоторых именованных символьных ссылок в атрибутах происходит даже с опущенной точкой с запятой."

Итак, в этом случае editable && copy (обратите внимание, что пробелы вокруг &&) допустимы HTML5, сериализованные как HTML-конструкция, поскольку ни один из за амперсандами следует письмо.

в качестве встречного примера:editable&&copy небезопасно (даже если это может сработать) в качестве последней последовательности &copy может интерпретироваться как ссылка на сущность для ©

Случай 1 : сериализация XML

(менее распространенных)

здесь применяются классические правила XML. Например, каждый амперсанд в тексте или атрибутах должен быть экранирован как &amp;.

в этом случае && (С или без пробелов) является недопустимым XML. Вы должны написать &amp;&amp;

сложно, не так ли ?