我一直在使用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.