为什么PHP DOM不包含自闭标记的斜杠?

pet*_*est 9 php dom

我一直在使用PHP的DOM加载一个html模板,修改它并输出它.最近我发现自闭(空)标签不包括斜线,即使模板文件也是如此.

例如

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"`"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

变为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是一个错误或设置,还是doctype问题?

bob*_*nce 21

DOMDocument->saveHTML()获取XML DOM信息集并将其写为旧式HTML,而不是XML.您不应该saveHTML()与XHTML doctype一起使用,因为它的输出将不是格式良好的XML.

如果您使用saveXML(),您将获得正确的XHTML.如果给它一个Content-Type: application/xhtml+xml标题,可以将这个XML输出提供给符合标准的浏览器.但不幸的是IE6-8将无法读取,因为它们仍然只能处理text/html媒体类型下的旧式HTML .

通常的折衷解决方案是提供text/html和使用XHTML 1.0规范的附录C中概述的"HTML兼容的XHTML".但遗憾的是,没有PHP DOMDocument->saveXHTML()方法可以为此生成正确的输出.

您可以采取一些措施来说服saveXML()某些常见情况下的HTML兼容输出.最主要的是,你必须确保HTML4定义,只有元素为具有EMPTY内容模型(<img>,<br>等)实际上确实有空洞的内容,从而导致自闭语法(<img/>)使用.其他元素不能使用自动关闭语法,因此如果它们是空的,则应在其文本内容中放置一个空格以阻止它们:

<script src="x.js"/>           <-- no good, confuses HTML parser and breaks page
<script src="x.js"> </script>  <-- fine
Run Code Online (Sandbox Code Playgroud)

要注意的另一个是内联<script><style>元素的处理,它们是XHTML中的普通元素,但是CDATAHTML中的特殊元素元素./*<![CDATA[*/.../*]]>*/需要进行一些包装才能使其中的任何字符<&字符始终保持一致,但请注意,您仍然必须避免使用]]></序列.

如果你想真正做到这一点,你必须编写自己的HTML兼容的XHTML序列化器.长期可能是一个更好的选择.但对于小的简单情况,黑客输入以使其不包含任何与XML不兼容的XML序列化程序的另一端可能是快速解决方案.

显然,这或者只是简单地使用旧式的非XML HTML.

  • 要使用`saveXML`避免`<script src ="x.js"/>`,请使用`$ node-> appendChild($ dom-> createTextNode(''));`. (2认同)