2

I'm looking for a spec on handling HTML entities in the href attribute of <a> tags. So far, no luck (I might be searching for something too specific).

In detail:

The bug I'm trying to fix is part of the cheerio project.

Some entities don't require a semicolon at the end. One of them is &curren. Anyway, this leads to problems when a source links to /test/example.jsp?item=123&currentSize=S&currentQty=1.

Browsers (at least Chrome) handle this nicely. I still haven't figured out why though.

4

2 回答 2

5

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

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

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

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

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

于 2013-04-23T11:48:49.117 回答
3

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

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

我找不到任何具体明确的说明在 HTML 中评估字符引用的位置,但属性部分暗示它:

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

HTML 5 改变了规则

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

…以及相同的变体。

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

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

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

于 2013-04-23T08:51:00.000 回答