我真的需要将“&”编码为“&”吗?

我在我的网站的<title>使用HTML5和UTF-8的“ & ”符号。 Google在其SERP上显示了&符号,正如其标题中的所有浏览器一样。

http://validator.w3.org给我这个:

&没有开始一个字符引用。 (&可能应该已经逃过了)。

我真的需要做&amp;

我并不是为了validation而对我的页面进行validation,但我很好奇听到人们对此的意见,如果这很重要,为什么。

是。 正如错误所述,在HTML中,属性是#PCDATA意思是它们被parsing。 这意味着你可以在属性中使用字符实体。 使用&本身是错误的,如果不是宽松的浏览器,并且这是HTML而不是XHTML的事实,将打破parsing。 只是逃避它作为&amp; 一切都会好起来的

HTML5允许您将其保留为非转义状态,但仅当随后的数据看起来不像有效的字符引用时。 但是,最好避免这个符号的所有情况,而不要担心哪个应该是哪个,哪个不需要。

牢记这一点, 如果您不是转义&to&amp;;对于您创build的数据(代码很可能无效)已经够糟糕的话,您可能也不会逃避标签分隔符,这对于用户提交的数据来说是一个巨大的问题,这很可能导致HTML和脚本注入,cookie窃取和其他攻击。

请只是逃避你的代码。 这将为您节省很多麻烦。

除了validation之外,事实上编码某些字符对于HTML文档是很重要的,这样它就可以像网页一样正确和安全地进行渲染。

编码&作为&amp; 在任何情况下,对我来说,生活是一个更容易的规则,减less错误和失败的可能性。

比较下面:哪个更容易? 哪个更容易搞砸

方法论1

  1. 写一些包含&字符的内容。
  2. 将它们全部编码。

方法论2

(请加一粒盐)))

  1. 写一些包含&字符的内容。
  2. 在个案的基础上,看每个&符号。 确定是否:
    • 它是孤立的,毫不含糊地是一个&符号。 例如。 volt & amp
      >在这种情况下,不要打扰编码。
    • 它并不是孤立的,但你认为它是毫不含糊的,因为由此产生的实体不存在,将永远不会存在,因为实体列表永远不会发展。 如amp&volt
      >在这种情况下,不要打扰编码。
    • 它不是孤立的,含糊不清的。 例如。 volt&amp
      >编码。

??

我已经仔细研究过,并在这里写下了我的发现: http : //mathiasbynens.be/notes/ambiguous-ampersands

我还创build了一个在线工具 ,您可以使用它来检查您的标记是否含有模糊的&符号或不以分号结尾的字符引用,这两个都是无效的。 (目前没有HTMLvalidation器正确执行此操作。)

http://i.imgur.com/cLssU.png

HTML5规则与HTML4不同。 在HTML5中这不是必需的 – 除非和号看起来像是启动参数名称。 “&copy = 2”仍然是一个问题,例如,因为&copy; 是版权符号。

但是在我看来,根据下面的文本决定编码还是不编码是比较困难的。 所以最简单的path可能是编码所有的时间。

我认为这已经变成了“浏览器不关心时为什么遵循规范”的问题。 这是我一般的答案:

标准不是“现在”的东西。 他们是一个“未来”的东西。 如果我们作为开发人员遵循Web标准,那么浏览器供应商更有可能正确地实现这些标准,并且我们更接近完全可互操作的Web,其中不需要CSS黑客入侵,特征检测和浏览器检测。 我们不必弄清为什么我们的布局在特定的浏览器中崩溃,或者如何解决这个问题。

具体来说,如果HTML5不需要使用&amp; 在您的特定情况下,您正在使用HTML5文档types(也期望您的用户使用符合HTML5的浏览器),那么没有理由这样做。

你能告诉我们你的title是什么吗? 当我提交

 <!DOCTYPE html> <html> <title>Dolce & Gabbana</title> <body> <p>am i allowed loose & mpersands?</p> </body> </html> 

http://validator.w3.org/明确要求它使用实验性的HTML 5模式 – 它没有任何抱怨& s …

那么,如果它来自用户input,那么绝对是的,原因很明显。 想想这个网站是不是这样做的:这个问题的标题会显示出来, 我真的需要编码'&'为'&'?

如果它只是像echo '<title>Dolce & Gabbana</title>'; 那么严格来说你不必这样做。 这样会更好,但是如果你没有用户会注意到这个区别。

在HTML中&标记一个引用的开始,无论是字符引用还是实体引用 。 从这一点来说,parsing器期望#表示一个字符引用,或者一个表示实体引用的实体名称,后面跟着一个; 。 这是正常的行为。

但是,如果引用名称或者只是引用开头&后面是空格或其他分隔符,如"'<>& ,结尾;甚至是一个引用来表示一个普通的&可以省略:

 <p title="&amp;">foo &amp; bar</p> <p title="&amp">foo &amp bar</p> <p title="&">foo & bar</p> 

只有在这种情况下,结局; 甚至可以省略引用本身(至less在HTML 4中)。 我认为HTML 5需要结束;

但规范build议始终使用像字符引用&#38; 或者实体参考&amp; 避免混淆:

作者应使用“ &amp; ”(ASCII小数点38)而不是“ & ”以避免与字符引用(实体引用开放定界符)的开始混淆。 作者还应该在属性值中使用“ &amp; ”,因为在CDATA属性值中允许字符引用。

如果用户把它传递给你,或者它将在一个URL中结束,你需要逃避它。

如果它出现在页面上的静态文本? 所有的浏览器都会得到这一个正确的方式,你不必担心,因为它会工作。

几年前,我们得到了一个报告,我们的一个Web应用程序在Firefox中显示不正确。 事实certificate,该网页包含一个看起来像一个标签

 <div style="..." ... style="..."> 

当面对重复样式属性时,IE将两种样式结合在一起,而Firefox只使用其中的一种,因此具有不同的行为。 我改变了标签

 <div style="...; ..." ...> 

果然,它解决了这个问题! 故事的寓意是浏览器对有效HTML的处理比对无效HTML的处理更加一致。 所以,已经修好你该死的标记了! (或者使用HTML Tidy来修复它。)

我正在检查为什么图片URL需要转义,因此在https://validator.w3.org中试过。; 解释是相当不错的。 它强调,即使URL需要逃脱。 [PS:我想它会消失,因为URL需要消耗。 任何人都可以澄清?]

 <img alt="" src="foo?bar=qut&qux=fop" /> 

在文档中find实体引用,但没有定义该名称的引用。 这通常是由拼写错误的引用名称,未编码的&符号,或者通过忽略尾随分号(;)而造成的。 导致此错误的最常见原因是WDG在“url中的和号”中描述的URL中的未编码&符号。 实体引用以&符号(&)开始,以分号(;)结尾。 如果你想在你的文档中使用文字符号,你必须把它编码为“&”(甚至在URLs里面!)。 注意用分号结束实体引用,否则您的实体引用可能会被解释为与以下文本相关。 另请注意,命名实体引用区分大小写。 &Aelig; 和æ是不同的字符。 如果此错误出现在PHP会话处理代码生成的某些标记中,则本文将对您的问题进行解释和解决。

是的,如果可能的话,你应该尝试提供有效的代码。

大多数浏览器会默默地纠正这个错误,但依靠浏览器中的error handling存在问题。 关于如何处理不正确的代码没有标准,所以每个浏览器供应商都试图弄清楚如何处理每个错误,结果可能会有所不同。

浏览器可能会有不同反应的一些示例是,如果将元素放在表格中但不在表格单元格之外,或者将链接嵌套在对方之内。

对于您的具体示例,不太可能导致任何问题,但浏览器中的错误更正可能会导致浏览器从符合标准的模式更改为怪异模式,这可能会使您的布局完全崩溃。

所以,你应该在代码中纠正像这样的错误,如果不是,那么为了保持错误列表在validation器中的短,这样你就可以发现更严重的问题。

如果&html中使用,那么你应该逃避它

如果&在JavaScriptstring中使用,例如alert('This & that'); 或document.href你不需要使用它。

如果你使用document.write,那么你应该使用它,例如document.write(<p>this &amp; that</p>)

这取决于分号在你的&附近结束的可能性,导致它显示一些完全不同的东西。

例如,在处理来自用户的input(例如,如果在标题标签中包含论坛post的用户提供的主题),则永远不知道他们可能在哪里放置随机分号,并且可能会随机显示奇怪的实体。 所以总是在这种情况下逃脱。

对于你自己的静态HTML,当然,你可以跳过它,但包括正确的转义是很微不足道的,没有理由避免它。

这个链接有一个相当好的例子,说明什么时候以及为什么你可能需要逃避&

https://jsfiddle.net/vh2h7usk/1/

有趣的是,我必须逃避angular色才能在我的答案中正确地expression。 如果我要使用内置的代码示例选项(从答案面板),我可以input&amp; 它看起来应该如此。 但是,如果我手动使用<code></code>元素,那么我必须转义才能正确表示它:)

如果你真的在谈论静态文本

 <title>Foo & Bar</title> 

存储在硬盘上的某个文件中,由服务器直接提供,然后是:可能不需要转义。

不过,由于现在的HTML内容非常less,完全是静态的,我将添加以下免责声明,假设HTML内容是从其他来源(数据库内容,用户input,Web服务调用结果,传统API结果等)生成的。 ..):

如果你不逃避一个简单的话,那么你也可能不会逃避一个&amp; 或者一个&nbsp;<b><script src="evil.html">或任何其他无效文字。 这意味着您最多只能错误地显示您的内容,而且更有可能被XSS攻击所困扰。

换句话说,当你已经检查和逃避其他更有问题的情况时,几乎没有理由离开那些没有完全破碎,但仍然有点鱼腥的单独和未经处理的情况。

不知道这是否对任何人有用…我一直在争取这一段时间…这是一个光荣的正则expression式,你可以用它来修复所有的链接,JavaScript,内容。 我不得不处理大量没有人想纠正的遗留内容。

将此添加到您的母版页或控件中的渲染覆盖:

请不要因为把这个放在错误的地方而使我失望:

 // remove the & from href="blaw?a=b&b=c" and replace with &amp; //in urls - this corrects any unencoded & not just those in URL's // this match will also ignore any matches it finds within <script> blocks AND // it will also ignore the matches where the link includes a javascript command like // <a href="javascript:alert{'& & &'}">blaw</a> html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);