<a href="somepage.html?x=1&y=2">...</a>
一个人应该写:
<a href="somepage.html?x=1&y=2">...</a>
显然,前一个例子不起作用,但浏览器错误恢复意味着它。
在HTML5中仍然如此吗?
我们现在已经过了严苛的XHTML要求时代。这是XHTML严格处理的要求,还是我作为Web开发人员应该知道的呢?
解决方法
The ampersand (&) may be left unescaped in more cases compared to HTML4.
实际上,HTML5规范描述了确定消费(和解释)字符意味着什么算法的实际算法。
特别是,在HTML5规范第8章的section on tokenizing character references中,我们看到当你在一个属性中时,你会看到一个符号字符后面跟着:
>标签,LF,FF,空格,<,&,EOF或其他允许的字符(如果引用属性值则为“或”,如果不是,则为“>”)===>然后&符号为只是一个&符号,不用担心;
>数字符号===>然后HTML5标记生成器将通过许多步骤来确定它是否具有数字字符实体引用,但请注意,在这种情况下,一个会受到解析错误(请阅读规范)
>任何其他角色===>解析器将尝试查找命名的字符引用,例如& notin;。
最后一个案例是你感兴趣的案例,因为你的例子有:
<a href="somepage.html?x=1&y=2">...</a>
你有角色序列
> AMPERSAND
>拉丁文小写字母Y.
>平等标志
现在这里是HTML5规范中与您的案例相关的部分,因为y不是命名实体引用:
If no match can be made,then no characters are consumed,and nothing is returned. In this case,if the characters after the U+0026 AMPERSAND character (&) consist of a sequence of one or more alphanumeric ASCII characters followed by a U+003B SEMICOLON character (;),then this is a parse error.
你没有分号,所以你没有解析错误。
现在假设你有,
<a href="somepage.html?x=1é=2">...</a>
这是不同的,因为& eacute;是HTML中的命名实体引用。在这种情况下,以下规则开始:
If the character reference is being consumed as part of an attribute,and the last character matched is not a “;” (U+003B) character,and the next character is either a “=” (U+003D) character or an alphanumeric ASCII character,then,for historical reasons,all the characters that were matched after the U+0026 AMPERSAND character (&) must be unconsumed,and nothing is returned. However,if this next character is in fact a “=” (U+003D) character,then this is a parse error,because some legacy user agents will misinterpret the markup in those cases.
因此,=使其成为错误,因为旧版浏览器可能会感到困惑。
尽管HTML5规范似乎不遗余力地说“好吧这个&符号没有开始一个字符实体引用所以这里没有引用”这个事实你可能遇到有命名引用的URL(例如,isin,part, sum,sub)会导致解析错误,那么恕我直言你最好用它们。但是,当然,你只询问限制是否放宽了属性,而不是你应该做什么,它看起来确实存在。
看看验证器可以做什么会很有趣。