我最近(从these questions)了解到,在某些时候,建议在 href 参数中编码&符号。也就是说,而不是写作:
<a href="somepage.html?x=1&y=2">...</a>
应该写一下:
<a href="somepage.html?x=1&y=2">...</a>
显然,前一个示例不起作用,但浏览器错误恢复意味着它。
我们现在已经过了严苛的XHTML要求时代。这是XHTML严格处理的要求,还是我作为Web开发人员应该注意的事情呢?
答案 0 :(得分:33)
从W3C Differences Page引用的HTML5和HTML4之间的区别之一是:
与HTML4相比,&符号(&amp;)可以在更多情况下保留未转义状态。
事实上,HTML5规范非常详细地描述了确定消费(和解释)字符意味着什么的实际算法。
特别是,在HTML5规范第8章的section on tokenizing character references中,我们看到当你在一个属性中时,你会看到一个&符号后面跟着:
<
,&
,EOF或其他允许的字符(如果引用属性值,则为"
或'
或>
如果没有)===&gt;那么&符只是一个&符号,不用担心; ∉
。最后一个案例是您感兴趣的案例,因为您的例子有:
<a href="somepage.html?x=1&y=2">...</a>
你有字符序列
现在,这是HTML5规范中与您的案例相关的部分,因为y
不是命名实体引用:
如果不能匹配,则不会消耗任何字符,也不会返回任何内容。在这种情况下,如果U + 0026 AMPERSAND字符(&amp;)之后的字符由一个或多个字母数字ASCII字符后跟一个U + 003B SEMICOLON字符(;)组成,则这是一个解析错误。
那里没有分号,因此您没有解析错误。
现在假设你有,
<a href="somepage.html?x=1é=2">...</a>
这是不同的,因为é
是HTML中的命名实体引用。在这种情况下,以下规则开始:
如果字符引用正在作为属性的一部分使用,并且匹配的最后一个字符不是“;” (U + 003B)字符,下一个字符是“=”(U + 003D)字符或字母数字ASCII字符,然后,由于历史原因,所有在U + 0026 AMPERSAND字符后匹配的字符(&amp; ;)必须是未消耗的,并且不返回任何内容。但是,如果下一个字符实际上是“=”(U + 003D)字符,那么这是一个解析错误,因为在这些情况下,某些旧版用户代理会误解标记。
因此,=
会导致错误,因为旧版浏览器可能会感到困惑。
尽管HTML5规范似乎不遗余力地说“好吧这个&符号没有开始一个字符实体引用所以这里没有引用”这个事实你可能会遇到具有命名引用的URL(例如{导致解析错误的{1}},isin
,part
,sum
),然后恕我直言,你最好用它们。但是,当然,你只询问限制是否放宽了属性,而不是你应该做什么,看起来它们确实存在。
看看验证器可以做什么会很有趣。