Dav*_*dRR 35 html xhtml escaping linq-to-xml html-entities
我正在修改由另一方创作的一些XHTML文件.作为这项工作的一部分,我正在通过Linq到XML进行批量编辑.
我刚刚注意到一些原始的源XHTML文件在这些文件中的文本节点中包含"HTML实体.例如:
<p>Greeting: "Hello, World!"</p>
Run Code Online (Sandbox Code Playgroud)
而当通过XElement.ToString()恢复XHTML文本时,"实体将被普通的双引号替换:
<p>Greeting: "Hello, World!"</p>
Run Code Online (Sandbox Code Playgroud)
问题:任何人都可以告诉我原作者使用"实体而不是普通双引号的动机是什么?这些实体是否达到了我不完全理解的目的?或者,我怀疑他们真的没必要吗?
我确实理解"在某些情况下是必要的,例如当需要在HTML属性中放置双引号时.例如:
<a href="/images/hello_world.jpg" alt="Greeting: "Hello, World!"">
Greeting</a>
Run Code Online (Sandbox Code Playgroud)
Juk*_*ela 29
知道使用"元素内容的动机是不可能的,也是不必要的,但可能的动机包括:对HTML规则的误解; 使用生成此类代码的软件(可能是因为其作者认为它"更安全"); 和误解的含义":许多人似乎认为它产生"聪明的报价"(他们显然从未看过实际的结果).
无论如何,从来没有必要"在HTML中使用元素内容(XHTML或任何其他HTML版本).任何HTML规范中都没有任何内容可以为那里的普通字符赋予任何特殊含义.
正如问题所说,它在属性值中有它的作用,但即使在它们中,如果值包含双引号,只使用单引号作为分隔符更为简单,例如,alt='Greeting: "Hello, World!"'或者,如果允许用自然语言纠正错误文本,使用适当的引号,例如alt="Greeting: “Hello, World!”"
原因#1
有一点,HTML/XHTML渲染器的错误/懒惰实现比那些正确实现的更常见.很多年前,我经常在主流浏览器中遇到渲染问题,这是因为在HTML/XHTML文档的常规文本内容中使用了未编码的引号字符.虽然HTML规范从未禁止在文本内容中使用这些字符,但无论如何编码它们成为相当标准的做法,因此非规范兼容的浏览器和其他处理器可以更优雅地处理它们.结果,许多"老年人"仍然可以反复地这样做.这不是不正确的,虽然它现在可能是不必要的,除非你的目标是一些非常古老的平台.
原因#2
当动态生成HTML内容时,例如,通过使用数据库中的简单字符串值填充HTML模板,必须在将每个值嵌入生成的内容之前对其进行编码.一些常见的服务器端语言为此提供了单个函数,它只编码在HTML文档中某些上下文中可能无效的所有字符.值得注意的是,PHP的功能就是这样一个例子.虽然有可选参数会导致它忽略引号,但这些参数很少被基本模板驱动系统的作者使用.结果是所有"特殊字符"在生成的HTML中出现的任何地方都被编码,而不考虑它们出现的上下文.同样,这不是不正确的,它根本就没有必要.htmlspecialchars()htmlspecialchars()
以我的经验,这可能是基于字符串的工具自动生成的结果,在这种情况下,作者不了解HTML规则。
When some developers generate HTML without the use of special XML-oriented tools, they may try to be sure the resulting HTML is valid by taking the approach that everything must be escaped.
Referring to your example, the reason why every occurrence of " is represented by " could be because using that approach, you can safely use such "special" characters in both attributes and values.
Another motivation I've seen is where people believe, "We must explicitly show that our symbols are not part of the syntax." Whereas, valid HTML can be created by using the proper string-manipulation tools, see the previous paragraph again.
Here is some pseudo-code loosely based on C#, although it is preferred to use valid methods and tools:
public class HtmlAndXmlWriter
{
private string Escape(string badString)
{
return badString.Replace("&", "&").Replace("\"", """).Replace("'", "'").Replace(">", ">").Replace("<", "<");
}
public string GetHtmlFromOutObject(Object obj)
{
return "<div class='type_" + Escape(obj.Type) + "'>" + Escape(obj.Value) + "</div>";
}
}
Run Code Online (Sandbox Code Playgroud)
It's really very common to see such approaches taken to generate HTML.
正如其他答案所指出的,它很可能是由某种工具生成的。
但如果我是该文件的原始作者,我的答案将是:一致性。
如果不允许我在属性中使用双引号,为什么要将它们放在元素的内容中?为什么这些规范总是有这些特殊情况.. 如果我必须编写 HTML 规范,我会说All double quotes need to be encoded。完毕。
今天就像In attribute values we need to encode double quotes, except when the attribute value itself is defined by single quotes. In the content of elements, double quotes can be, but are not required to be, encoded.(我肯定忘记了这里的一些案例)。
双引号是规范的关键字,对其进行编码。小于/大于是规范的关键字,对它们进行编码。ETC..
| 归档时间: |
|
| 查看次数: |
252722 次 |
| 最近记录: |