gpt4 book ai didi

html - 什么是所有 HTML 转义上下文?

转载 作者:太空狗 更新时间:2023-10-29 13:42:24 24 4
gpt4 key购买 nike

输出 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”应该是什么。但是,如果在 & 后面放一个空格,它就可以很好地验证。但是,如果您正在即时生成它,您可能不想检查每次使用 & 是否会导致验证错误,而只是转义所有 & 内部属性值。

最佳答案

<div>This is regular text</div>

文本内容: & 必须被转义。 < 必须被转义。

如果以非 UTF 编码生成文档,则必须对不适合所选编码的字符进行转义。

在 XHTML(以及一般的 XML)中,序列 ]]> 不得出现在文本内容中,因此在这种特定情况下,必须对该序列中的一个字符进行转义,传统上为 > 。为了一致性,Canonical XML 规范选择每次在文本内容中转义 >,这对于转义函数来说不是一个糟糕的策略,尽管您当然可以跳过它进行手工创作。
<input value="this is value text">

属性值: & 必须被转义。必须对属性值分隔符 "' 进行转义。如果没有使用属性值分隔符(不要这样做),则不可能进行转义。

规范 XML 始终选择 " 作为分隔符,因此对其进行转义。 > 字符不需要在属性值中转义,Canonical XML 不需要。 HTML4 规范建议无论如何编码 > 以实现向后兼容性,但这只会影响一些现在没人记得的真正古老而可怕的浏览器;你可以忽略它。

在 XHTML 中 < 必须被转义。虽然您可以在 HTML4 中不转义它,但这不是一个好主意。

要在属性值中包含制表符、CR 或 LF(而不会将它们通过属性值规范化算法转换为纯空格),您必须将它们编码为字符引用。

对于文本内容和属性值:在 XML 1.1 下的 XHTML 中,您必须对受限字符进行转义,即删除字符和 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 -->

是的,但是由于在评论中无法转义,因此您无能为力。如果你写 <!-- &lt; --> ,它的字面意思是包含“&字母 l 字母 t 分号”的注释,并将在 DOM 或其他信息集中反射(reflect)。包含 -- 的注释根本无法序列化。

XML 中的 <![CDATA[ 节和 <?pi s 也不能使用转义。序列化包含 ]]> 序列的 CDATA 部分的传统解决方案是将该序列拆分为两个 CDATA 部分,这样它就不会一起出现。您无法在单个 CDATA 部分中序列化它,也无法序列化数据中带有 ?> 的 PI。

HTML(不是 XHTML)中的 <script><style> 等 CDATA 元素可能不包含 </ (ETAGO) 序列,因为这会提前结束元素,如果后面没有结束标记名称,则会出错。由于在 CDATA 元素中不可能进行转义,因此必须避免并解决此序列(例如,通过将 document.write('</p>') 转换为 document.write('<\/p>'); 。(您会看到许多更复杂的愚蠢策略来解决这个问题,例如在 JS-上调用 unescape) % 编码的字符串;甚至经常是 '</scr'+'ipt>',这仍然是非常无效的。)

HTML 和 XML 中还有另一种适用不同规则的上下文,那就是在 DTD(包括 DOCTYPE 声明中的内部子集,如果有的话)中,其中 % 字符具有特殊权力,需要转义才能成为字面上使用。但是,作为 HTML 文档作者,您几乎不可能需要接近那一团乱麻。
The following text will throw errors as HTML 4.01 Strict:

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

是的,这也是 Transitional 中的一个错误。
If you put a space after the &, however, it validates just fine. 

是的,在 SGML 规则下,除了 [A-Za-z]# 之外的任何内容都不会作为引用开始解析。不过,依赖于此并不是一个好主意。 (当然,它在 XHTML 中的格式不是很好。)

关于html - 什么是所有 HTML 转义上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1911022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com