确实,从W3C 差异页面引用的 HTML5 和 HTML4 之间的差异之一是:
与 HTML4 相比,与号 (&) 可能在更多情况下不进行转义。
事实上,HTML5 规范不遗余力地描述了确定使用(和解释)字符意味着什么的实际算法。
特别是,在HTML5 规范第 8 章中关于标记字符引用的部分中,我们看到当你在一个属性中时,你会看到一个 & 字符后跟:
- tab, LF, FF, space,
<
, &
, EOF, 或额外的允许字符(一个"
或'
如果属性值被引用或>
如果不是)===> 那么&符号只是一个&符号,不用担心;
- 一个数字符号 ===> 然后 HTML5 标记器将通过许多步骤来确定它是否具有数字字符实体引用,但请注意在这种情况下会出现解析错误(请阅读规范)
- 任何其他字符 ===> 解析器将尝试查找命名字符引用,例如
∉
.
最后一种情况是您感兴趣的,因为您的示例具有:
<a href="somepage.html?x=1&y=2">...</a>
你有字符序列
现在这是 HTML5 规范中与您的情况相关的部分,因为y
它不是命名实体引用:
如果无法进行匹配,则不消耗任何字符,也不返回任何内容。在这种情况下,如果 U+0026 AMPERSAND 字符 (&) 之后的字符由一个或多个字母数字 ASCII 字符的序列组成,后跟一个 U+003B 分号字符 (;),则这是一个解析错误。
你那里没有分号,所以你没有解析错误。
现在假设你有,相反,
<a href="somepage.html?x=1é=2">...</a>
这是不同的,因为它是é
HTML 中的命名实体引用。在这种情况下,以下规则生效:
如果字符引用作为属性的一部分使用,并且匹配的最后一个字符不是“;” (U+003B) 字符,并且下一个字符是“=” (U+003D) 字符或字母数字 ASCII 字符,那么由于历史原因,所有在 U+0026 AMPERSAND 字符 (& ) 必须未使用,并且不返回任何内容。然而,如果这个下一个字符实际上是一个“=”(U+003D)字符,那么这是一个解析错误,因为在这些情况下一些遗留用户代理会误解标记。
因此,这=
会导致错误,因为旧版浏览器可能会感到困惑。
尽管 HTML5 规范似乎不遗余力地说“这个 & 符号不是开始字符实体引用,所以这里没有引用”,但您可能会遇到具有命名引用的 URL (isin
例如,、、、、part
)这将导致解析错误,那么恕我直言,您最好使用它们。当然,你只问了属性上的限制有没有放宽,而不是你应该怎么做,而且看起来确实是放宽了。sum
sub
看看验证者能做什么会很有趣。