HTML 4状态相当which characters应该被转义:
四个字符实体引用值得特别提及,因为它们经常用于转义特殊字符:“&lt;”代表<符号 . “&gt;” 中代表>符号 . “&安培;”代表&符号 . “”代表“标记 . 希望在文本中加入“<”字符的作者应使用“&lt;” (ASCII十进制60)以避免可能与标记的开头混淆(开始标记打开分隔符) . 同样,作者应使用“&gt;” (ASCII十进制62)在文本而不是“>”中,以避免旧的用户代理在出现在引用的属性值中时错误地将其视为标记的末尾(标记关闭分隔符)的问题 . 作者应该使用“&amp;” (ASCII十进制38)而不是“&”以避免与字符引用(实体引用打开分隔符)的开头混淆 . 作者也应该使用“&amp;”在属性值中,因为在CDATA属性值中允许字符引用 . 一些作者使用字符实体引用“”“编码双引号(“)的实例,因为该字符可用于分隔属性值 .
我在HTML 5中找到了类似的东西 . 在grep的帮助下,我能找到的唯一非XML提及是关于_85150的:
改用pre和code,并将“<”和“&”字符转义为“&lt;”和“&amp;”分别 .
可以在某种程度上指出这件事的官方消息来源吗?
3 回答
specification defines the syntax for normal elements为:
所以当你跟着anything that could begin a character reference时你必须逃避
<
或&
. 关于&符号的规则是引用属性的唯一规则,因为匹配的引号是唯一终止一个的引号 . (显然,如果您不想在那里终止属性值,请转义引号 . )这些规则不适用于
<script>
和<style>
;你应该避免在其中加入动态内容 . (如果必须在<script>
中包含JSON,请将<
替换为\x3c
,将U 2028字符替换为\u2028
,将U 2029替换为\u2029
,以后进行JSON序列化 . )来自http://www.w3.org/html/wg/drafts/html/master/single-page.html#serializing-html-fragments
*算法是内置的序列化算法,例如被称为由
innerHTML
getter .严格地说,这不是你的问题的一个问题,因为它处理序列化而不是解析 . 但另一方面,序列化输出旨在安全地解析 . 因此,通过暗示,在编写标记时:
&
字符应替换为&
不间断的空格应该被转义为
(惊喜!......)在属性中,
"
应该被转义为"
属性之外,
<
应该被转义为<
,>
应该被转义为>
我故意写“应该”而不是“必须”,因为解析器可以纠正违反上述内容的行为 .
加上我的声音,坚持说事情并不那么容易 - 严格来说:
HTML5是一种语言规范
it could be serialized either as HTML or as XML
案例1:HTML序列化
(最普遍的)
如果您将HTML5序列化为HTML,"the text must not contain the character U+003C LESS-THAN SIGN (<) or an ambiguous ampersand."
一个模棱两角的&符是"ampersand followed by one or more alphanumeric ASCII characters, followed by a U+003B SEMICOLON character (;)"
此外,"the parsing of certain named character references in attributes happens even with the closing semicolon being omitted."
因此,在这种情况下
editable && copy
(注意&&周围的空格)是有效的HTML5序列化为HTML构造,因为没有一个&符后跟一个字母 .作为一个反例:
editable&©
不安全(即使这可能有效),因为最后一个序列©
可能被解释为©
的实体引用案例1:XML序列化
(不太常见)
这里适用经典的XML规则 . 例如,文本或属性中的每个&符号都应转义为
&
.在这种情况下,
&&
(带或不带空格)是无效的XML . 你应该写&&
整蛊,不是吗?