我使用PHP中的DOM扩展来构建一些HTML文档,并且我希望输出的格式正确(带有新行和缩进),以便从我做过的许多测试中都可以读取:
如果有人有不同的了解,我真的很想知道他们是如何使其工作的。
因此,我有一个DOM文档,并且正在使用saveHTML()输出HTML。由于它来自DOM,我知道它是有效的,因此无需“整理”或以任何方式对其进行验证。
我只是在寻找一种从DOM扩展收到的输出中获取格式正确的输出的方法。
注意 您可能已经猜到了,我不想使用Tidy扩展名,因为a)它所做的还远远超过了我的需要(标记已经有效),b)实际上对HTML内容进行了更改(例如HTML 5文档类型和一些元素)。
跟进:
好的,借助下面的答案,我已经弄清了为什么DOM扩展无法正常工作。尽管给定的示例有效,但仍无法与我的代码一起使用。在此评论的帮助下,我发现,如果您有isWhitespaceInElementContent()为true的任何文本节点,则超出该点将不应用任何格式。无论preserveWhiteSpace是否为false,都会发生这种情况。解决方案是删除所有这些节点(尽管我不确定这是否会对实际内容产生不利影响)。
没错,HTML似乎没有缩进(其他人也很困惑)。即使加载了代码,XML仍然有效。
<?php function tidyHTML($buffer) { // load our document into a DOM object $dom = new DOMDocument(); // we want nice output $dom->preserveWhiteSpace = false; $dom->loadHTML($buffer); $dom->formatOutput = true; return($dom->saveHTML()); } // start output buffering, using our nice // callback function to format the output. ob_start("tidyHTML"); ?> <html> <head> <title>foo bar</title><meta name="bar" value="foo"><body><h1>bar foo</h1><p>It's like comparing apples to oranges.</p></body></html> <?php // this will be called implicitly, but we'll // call it manually to illustrate the point. ob_end_flush(); ?>
结果:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html> <head> <title>foo bar</title> <meta name="bar" value="foo"> </head> <body> <h1>bar foo</h1> <p>It's like comparing apples to oranges.</p> </body> </html>
与saveXML()相同…
<?xml version="1.0" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html> <head> <title>foo bar</title> <meta name="bar" value="foo"/> </head> <body> <h1>bar foo</h1> <p>It's like comparing apples to oranges.</p> </body> </html>
可能忘记了在loadHTML之前设置preserveWhiteSpace = false?
免责声明:我从tyson clugg / php手册注释中窃取了大多数演示代码。懒我
更新: 我现在记得几年前,我尝试过同样的事情,遇到了同样的问题。我通过应用一种肮脏的解决方法(对性能要求不高)解决了这个问题:我只是以某种方式在SimpleXML和DOM之间转换,直到问题消失。我想转换摆脱了那些节点。也许用dom加载,用导入simplexml_import_dom,然后输出字符串,再次用DOM解析它, 然后 漂亮地打印出来。据我记得这工作(但它 真的很 慢)。
simplexml_import_dom