30

我最近(从这些 问题中)了解到,在某些时候建议在href参数中编码与符号。也就是说,而不是写:

<a href="somepage.html?x=1&y=2">...</a>

应该写:

<a href="somepage.html?x=1&amp;y=2">...</a>

显然,前一个示例不应该工作,但浏览器错误恢复意味着它可以工作。

HTML5 中仍然是这种情况吗?

我们现在已经过了严格的 XHTML 要求的时代。这是 XHTML 严格处理的要求,还是我作为 Web 开发人员应该注意的事情?

4

1 回答 1

40

确实,从W3C 差异页面引用的 HTML5 和 HTML4 之间的差异之一是:

与 HTML4 相比,与号 (&) 可能在更多情况下不进行转义。

事实上,HTML5 规范不遗余力地描述了确定使用(和解释)字符意味着什么的实际算法。

特别是,在HTML5 规范第 8 章中关于标记字符引用的部分中,我们看到当你在一个属性中时,你会看到一个 & 字符后跟:

  • tab, LF, FF, space, <, &, EOF, 或额外的允许字符(一个"'如果属性值被引用或>如果不是)===> 那么&符号只是一个&符号,不用担心;
  • 一个数字符号 ===> 然后 HTML5 标记器将通过许多步骤来确定它是否具有数字字符实体引用,但请注意在这种情况下会出现解析错误(请阅读规范)
  • 任何其他字符 ===> 解析器将尝试查找命名字符引用,例如&notin;.

最后一种情况是您感兴趣的,因为您的示例具有:

<a href="somepage.html?x=1&y=2">...</a>

你有字符序列

  • 与号
  • 拉丁文小写字母 Y
  • 等号

现在这是 HTML5 规范中与您的情况相关的部分,因为y它不是命名实体引用:

如果无法进行匹配,则不消耗任何字符,也不返回任何内容。在这种情况下,如果 U+0026 AMPERSAND 字符 (&) 之后的字符由一个或多个字母数字 ASCII 字符的序列组成,后跟一个 U+003B 分号字符 (;),则这是一个解析错误。

你那里没有分号,所以你没有解析错误。

现在假设你有,相反,

<a href="somepage.html?x=1&eacute=2">...</a>

这是不同的,因为它是&eacute; HTML 中的命名实体引用。在这种情况下,以下规则生效:

如果字符引用作为属性的一部分使用,并且匹配的最后一个字符不是“;” (U+003B) 字符,并且下一个字符是“=” (U+003D) 字符或字母数字 ASCII 字符,那么由于历史原因,所有在 U+0026 AMPERSAND 字符 (& ) 必须未使用,并且不返回任何内容。然而,如果这个下一个字符实际上是一个“=”(U+003D)字符,那么这是一个解析错误,因为在这些情况下一些遗留用户代理会误解标记。

因此,这=会导致错误,因为旧版浏览器可能会感到困惑。

尽管 HTML5 规范似乎不遗余力地说“这个 & 符号不是开始字符实体引用,所以这里没有引用”,但您可能会遇到具有命名引用的 URL (isin例如,、、、、part)这将导致解析错误,那么恕我直言,您最好使用它们。当然,你只问了属性上的限制有没有放宽,而不是你应该怎么做,而且看起来确实是放宽了。sumsub

看看验证者能做什么会很有趣。

于 2013-10-18T05:20:04.850 回答