Какие символы должны быть экранированы в HTML 5?
HTML 4 утверждает довольно какие символы должны быть экранированы:
Четыре символьные ссылки на объекты заслуживают особого упоминания, поскольку они часто используются для вызова специальных символов:
- "& л;" представляет собой < знак.
- "& GT;" представляет знак > .
- "& амп;" представляет знак и.
- " "представл ет" метку ".
Авторы, желающие для установки" < "символ в тексте должен использовать" & lt; "(ASCII десятичное число 60) во избежание возможной путаницы с началом тега (начальный тег открытый разделитель). Точно так же авторы должны использовать" & gt; "(ASCII десятичное 62) в тексте вместо" > ", чтобы избежать проблем со старыми пользовательскими агентами которые неправильно воспринимают это как конец тега (закрыть тег разделитель), когда он отображается в значениях кавычек.
Авторы должны использовать" & amp; "(ASCII-децимал 38) вместо" & "избегать путаница с началом ссылки на символ (объект ссылочный открытый разделитель). Авторы также должны использовать" & amp; "в значения атрибутов, поскольку в CDATA допускаются ссылки на символы значения атрибутов.
Некоторые авторы используют ссылку на символ символа"" "кодировать экземпляры метки двойной кавычки (" ), поскольку этот символ может быть используется для разграничения значений атрибутов.
Я удивлен, что не могу найти что-либо подобное в HTML 5. С помощью grep единственное упоминание, отличное от XML, которое я могу найти, относится к устаревшему XMP-элемент:
Вместо этого используйте pre и code и выйдите из "<" и "&" символы как "& lt;" и "& amp;" соответственно.
Может ли это указать на официальный источник по этому вопросу?
Ответы
Ответ 1
Спецификация определяет синтаксис для обычных элементов как:
Нормальные элементы могут иметь текст, ссылки на символы, другие элементы и комментарии, но текст не должен содержать символ U + 003C LESS-THAN SIGN (<) или неоднозначный амперсанд. Некоторые нормальные элементы также имеют еще больше ограничений на то, какое содержимое они могут удерживать, за пределами ограничений, налагаемых моделью контента, и теми, которые описаны в этом параграфе. Эти ограничения описаны ниже.
Таким образом, вам нужно выйти <
или &
, после чего все, что может начать ссылку на символ. Правило об амперсандах является единственным таким правилом для цитируемых атрибутов, поскольку совпадающая кавычка является единственной вещью, которая ее прервет. (Очевидно, что если вы не хотите прекратить значение атрибута там, избегайте кавычки.)
Эти правила не применяются к <script>
и <style>
; вам следует избегать размещения в них динамического контента. (Если вы должны включить JSON в <script>
, замените <
на \x3c
, символ U + 2028 с помощью \u2028
и U + 2029 с \u2029
после сериализации JSON.)
Ответ 2
Из http://www.w3.org/html/wg/drafts/html/master/single-page.html#serializing-html-fragments
Экранирование строки (для целей алгоритма * выше) состоит выполнения следующих шагов:
- Заменить любое событие "&" символ по строке "&".
- Замените любые вхождения символа U + 00A0 NO-BREAK SPACE строкой "& nbsp;".
- Если алгоритм был вызван в режиме атрибута, замените любые вхождения символа "" на строку """.
- Если алгоритм не был вызван в режиме атрибута, замените любые вхождения "<" символ по строке "& lt;", и любой вхождения символа " > " по строке "& gt".
* Алгоритм - это встроенный алгоритм сериализации, называемый, например. геттером innerHTML
.
Строго говоря, это не совсем вопрос вашего вопроса, поскольку он касается сериализации, а не синтаксического анализа. Но, с другой стороны, сериализованный выход предназначен для безопасного анализа. Таким образом, при написании разметки:
- Символ
&
следует заменить на &
- Неразрывные пробелы должны быть экранированы как
(сюрприз!...)
- Внутри атрибутов
"
следует экранировать как "
- Вне атрибутов
<
следует экранировать как <
и >
следует экранировать как >
Я намеренно пишу "should", а не "must", поскольку парсеры могут исправлять нарушения вышеуказанного.
Ответ 3
Добавление моего голоса, чтобы настаивать на том, что все не так просто - строго говоря:
Случай 1: Сериализация HTML
(наиболее распространенный)
Если вы упорядочиваете HTML5 как HTML, "текст не должен содержать символ U + 003C LESS-THAN SIGN (<) или неоднозначный амперсанд."
Неоднозначный амперсанд - это "амперсанд, за которым следует один или несколько буквенно-цифровых символов ASCII, за которым следует символ U + 003B SEMICOLON (;)"
Кроме того, разбор некоторых имен символов в атрибутах происходит даже при закрытии закрывающей точки с запятой.
Итак, в этом случае editable && copy
(обратите внимание на пробелы вокруг &), допустим, HTML5 сериализуется как конструкция HTML, так как ни один из амперсандов не сопровождается буквой.
В качестве примера счетчика: editable&©
небезопасно (даже если это может сработать), поскольку последняя последовательность ©
может быть интерпретирована как ссылка на объект для ©
Случай 1: Сериализация XML
(менее распространенный)
Здесь применяются классические правила XML. Например, каждый амперсанд либо в тексте, либо в атрибутах должен быть экранирован как &
.
В этом случае &&
(с пробелами или без него) является недопустимым XML. Вы должны написать &&
Трудно, не так ли?