是否仍需要在HTML5中的URL中编码&符号?

前端之家收集整理的这篇文章主要介绍了是否仍需要在HTML5中的URL中编码&符号?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近(从 these questions)了解到,在某些时候,建议在href参数中编码&符号。也就是说,而不是写:
<a href="somepage.html?x=1&y=2">...</a>

一个人应该写:

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

显然,前一个例子不起作用,但浏览器错误恢复意味着它。

在HTML5中仍然如此吗?

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

解决方法

确实,引自 W3C Differences Page的HTML5和HTML4之间的差异之一是:

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&eacute=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)会导致解析错误,那么恕我直言你最好用它们。但是,当然,你只询问限制是否放宽了属性,而不是你应该做什么,它看起来确实存在。

看看验证器可以做什么会很有趣。

猜你在找的HTML5相关文章