Каковы все экранирующие контексты HTML?

При выводе HTML существует несколько разных мест, где текст можно интерпретировать как управляющие символы, а не как текстовые литералы. Например, в «обычном» тексте (то есть вне любой разметки элемента):

<div>This is regular text</div>

А также в пределах значений атрибутов:

<input value="this is value text">

И, я полагаю, в комментариях HTML:

<!-- This text here might be programmatically generated
and could, in theory, contain the double-hyphen character
sequence, which is verboten inside comments -->

Каждый из этих трех видов текста имеетразные правила того, как он должен быть экранирован, чтобы считаться не разметкой. Итак, мой первый вопрос: есть ли в HTML другие контексты, в которых символы можно интерпретировать как символы разметки / контроля? Вышеуказанные контексты явно имеют разные правила о том, что необходимо избежать.

Второй вопрос: каковы канонические, глобально безопасные списки символов (для каждого контекста), которые необходимо экранировать, чтобы гарантировать, что любой встроенный текст будет рассматриваться как не разметка? Например, в теории вам нужно только избегать 'и' в значениях атрибута, так какв пределах значения атрибута только символ закрывающего-разделителя ('или', в зависимости от того, с каким разделителем начинается значение атрибута) будет иметь контрольное значение. Аналогично, только внутри "обычного" текста <и & имеет контрольное значение. (Я понимаю, что не все анализаторы HTML идентичны В основном меня интересует минимальный набор символов, который нужно экранировать, чтобы успокоить синтаксический анализатор, соответствующий спецификации.)

Тангенциально: следующий текст будет выдавать ошибки как HTML 4.01 Strict:

<a href="http://example.com/file.php?x=1&y=2">foo</a>

В частности, он говорит, что не знает, какой должна быть сущность "& y". Однако, если вы поставите пробел после &, это будет очень хорошо. Но если вы генерируете это на лету, вы, вероятно, не захотите проверять, будет ли каждое использование & вызывать ошибку проверки, а вместо этого просто избегать значений атрибутов all & inside.

Ответы на вопрос(5)

Ваш ответ на вопрос