引自W3C Differences Page,确实HTML5和HTML4的区别之一是:
与 HTML4 相比,与号 (&) 在更多情况下可能不转义。
事实上,HTML5 规范不遗余力地描述了确定使用(和解释)字符意味着什么的实际算法。
特别是,在 HTML5 规范第 8 章中的 section on tokenizing character references 中,我们看到当您在一个属性中时,您会看到一个 & 字符后跟:
- 制表符、LF、FF、空格、
<、&、EOF 或其他允许的字符(如果属性值被引用,则为 " 或 ',否则为 >) ===> 那么&符号只是&符号,不用担心;
- 一个数字符号 ===> 然后 HTML5 标记器将通过许多步骤来确定它是否具有数字字符实体引用,但请注意在这种情况下会出现 解析错误(请阅读规范)
- 任何其他字符 ===> 解析器将尝试查找命名字符引用,例如
&notin;。
最后一个案例是您感兴趣的,因为您的示例有:
<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>
这是不同的,因为&eacute; 是 HTML 中的命名实体引用。在这种情况下,以下规则生效:
如果字符引用作为属性的一部分被使用,并且匹配的最后一个字符不是“;” (U+003B) 字符,并且下一个字符是“=” (U+003D) 字符或字母数字 ASCII 字符,那么由于历史原因,所有在 U+0026 AMPERSAND 字符 (& ) 必须未使用,并且不返回任何内容。但是,如果下一个字符实际上是“=” (U+003D) 字符,那么这是一个解析错误,因为在这些情况下,一些旧版用户代理会误解标记。
所以= 使它成为一个错误,因为旧版浏览器可能会混淆。
尽管 HTML5 规范似乎不遗余力地表示“这个 & 符号不是开始字符实体引用,所以这里没有引用”,但您可能会遇到具有命名引用的 URL(例如,@ 987654335@, part, sum, sub) 这会导致解析错误,那么恕我直言,你最好使用它们。不过当然,你只问属性上的限制有没有放宽,而不是应该怎么做,看来确实放宽了。
看看验证器能做什么会很有趣。