Что весь 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:

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

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

8
задан dirtside 15 December 2009 в 22:51
поделиться

3 ответа

<div>This is regular text</div>

Текстовое содержание: & должно быть экранировано. < должен быть экранирован.

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

В XHTML (и XML в целом), последовательность ]]> не должна встречаться в текстовом содержимом, поэтому в этом конкретном случае один из символов в этой последовательности должен быть экранирован, традиционно > . Для единообразия спецификация Canonical XML выбирает экранирование > каждый раз в текстовом содержимом, что является неплохой стратегией для функции экранирования, хотя вы, безусловно, можете пропустить ее при ручном редактировании.

<input value="this is value text">

Значения атрибутов : & необходимо экранировать. Ограничитель значений атрибута " или ' должен быть экранирован.

Как для текстового содержимого, так и для значений атрибутов : в XHTML в XML 1.1 вы должны экранировать запрещенные символы, которые представляют собой символ удаления и управляющие коды C0 и C1, табуляцию минус, CR, LF и NEL. Итого [\ x01- \ x08 \ x0B \ x0C \ x0E- \ x1F \ x7F- \ x84 \ x86- \ x9F] . Нулевой символ может вообще не включаться, даже если он экранирован в XML 1.1. Вне XML 1.1 вы вообще не можете использовать ни один из этих символов, и нет веской причины, по которой вы когда-либо хотели бы это делать.

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

Да, но поскольку экранирование внутри комментариев невозможно, вы ничего не можете с этим поделать Это. Если вы напишете , это буквально означает комментарий, содержащий «амперсанд-буква, l-буква, t-точка с запятой», и будет отражен как таковой в DOM или другом информационном наборе. Комментарий, содержащий - , просто не может быть сериализован вообще.

разделы и в XML также не могут использовать экранирование. Традиционное решение для сериализации раздела CDATA, включающего последовательность ]> , состоит в том, чтобы разделить эту последовательность на два раздела CDATA, чтобы они не встречались вместе. Вы не можете сериализовать его в одном разделе CDATA, и вы не можете сериализовать PI с ?> в данных.

CDATA-элементы, такие как