【问题标题】:Spec for handling of HTML entities in a[href]处理 a[href] 中的 HTML 实体的规范
【发布时间】:2013-04-23 23:10:16
【问题描述】:

我正在寻找在<a> 标签的href 属性中处理HTML 实体的规范。到目前为止,没有运气(我可能正在寻找一些过于具体的东西)。

详细说明:

我正在尝试修复的 bugcheerio 项目的一部分。

有些实体的末尾不需要分号。其中之一是&curren。无论如何,当源链接到/test/example.jsp?item=123&currentSize=S&currentQty=1 时,这会导致问题。

浏览器(至少是 Chrome)handle this 很好。不过我还没弄明白为什么。

【问题讨论】:

    标签: html browser specifications


    【解决方案1】:

    关于 HTML 4.01(包括 HTML 4.01),请参阅@Quentin 的回答。

    关于 XHTML 的任何风格,包括 XHTML 序列化中的 HTML5,&currentSize= 包含格式正确的错误,因此文档的任何显示都被中止(当文档被处理为真正的 XHTML 时)。

    在 HTML5 中的 HTML 序列化中,parsing character references 有一些棘手的临时规则。它们暗示在文本内容中,&currentSize= 将被解析为好像写成&curr;entSize=,即¤entSize=。但在属性值内,如<a href="...">,则在某些条件下,无法识别引用,因为它没有以分号结尾。

    具体来说,这里描述的条件是:“如果字符引用作为属性的一部分被使用,并且最后匹配的字符不是“;” (U+003B) 字符,并且下一个字符是“=” (U+003D) 字符或在 ASCII 数字、大写 ASCII 字母或小写 ASCII 字母范围内,然后,由于历史原因,所有字符在 U+0026 AMPERSAND 字符 (&) 之后匹配的字符必须未使用,并且不返回任何内容。”因此,即使foobar 是已定义的名称,也不会在属性值中识别&foobar=

    原因是作者在属性值中广泛编写 URL 而不转义 &,浏览器已经适应了这一点。

    【讨论】:

    • 您有适用于哪些条件的链接吗?我已经在深入研究 webkit 源代码了,但是很乱。
    • @fb55,条件在我参考的部分的HTML5 RC中有描述,不过你需要向前扫描才能看到描述。我会把它添加到我的答案中。
    【解决方案2】:

    我可能正在寻找一些过于具体的东西。

    你是。它们的处理方式与其他任何地方相同(定义为包含 CDATA 的元素除外)。

    我找不到任何 specificexplicit 说明在 HTML 中评估字符引用的位置,但 the attributes 部分暗示它:

    使用双引号(ASCII 十进制 34)或单引号(ASCII 十进制 39)分隔所有属性值。当值由双引号分隔时,可以在属性值中包含单引号,反之亦然。作者还可以使用数字字符引用来表示双引号 (") 和单引号 (')。对于双引号作者也可以使用字符实体引用"

    HTML 5 changes the rules 与:

    必须以“;”结尾(U+003B) 字符。

    ……以及相同的变体。

    但是,一些浏览器仍然支持旧标准,当实体后跟非名称字符时,分号是可选的。这方面的标准是 ISO SGML 规范,您必须为此付费,但 HTML 4.0 says

    注意:在 SGML 中,可以去掉最后的“;”在某些情况下,在数字或命名字符引用之后(例如,在换行符处或直接在标记之前)。在其他情况下,它可能不会被消除(例如,在单词中间)。我们强烈建议使用“;”在所有情况下,以避免需要此字符存在的用户代理出现问题。

    简而言之,为了向后兼容和清晰,如果您想在 href 属性的 URL 中包含 & 字符,则只需将其表示为 &。这在任何地方都有效。

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 2012-08-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 2017-07-04
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多