PHP"漂亮的打印"HTML(不整齐)

Jac*_*ght 29 html php format tidy

我在PHP中使用DOM扩展来构建一些HTML文档,我希望输出格式很好(使用新行和缩进),以便它可读,但是,我已经完成了很多测试:

  1. "formatOutput = true"对saveHTML()完全不起作用,只有saveXML()
  2. 即使我使用了saveXML(),它仍然只适用于通过DOM创建的元素,而不是loadHTML()中包含的元素,即使"preserveWhiteSpace = false"也是如此.

如果有人知道不同,我真的很想知道他们是如何让它工作的.

所以,我有一个DOM文档,我正在使用saveHTML()来输出HTML.因为它来自DOM,我知道它是有效的,没有必要以任何方式"整理"或验证它.

我只是想找到一种从DOM扩展接收的输出中获得格式良好的输出的方法.

NB.正如您可能已经猜到的那样,我不想使用Tidy扩展作为a)它还需要它做更多(标记已经有效)和b)它实际上对HTML内容进行了更改(例如HTML 5 doctype和一些元素).

跟进:

好的,在下面的答案的帮助下,我已经找出了DOM扩展无法正常工作的原因.虽然给定的示例有效,但仍然无法使用我的代码.在这个评论的帮助下,我发现如果你有任何文本节点,其中isWhitespaceInElementContent()为true,那么除此之外不会应用格式化.无论preserveWhiteSpace是否为false,都会发生这种情况.解决方案是删除所有这些节点(虽然我不确定这是否会对实际内容产生负面影响).

ste*_*efs 29

你是对的,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();
?>
Run Code Online (Sandbox Code Playgroud)

结果:

<!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>
Run Code Online (Sandbox Code Playgroud)

与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>
Run Code Online (Sandbox Code Playgroud)

可能忘记在loadHTML之前设置preserveWhiteSpace = false?

免责声明:我从tyson clugg/php手册评论中偷走了大部分演示代码.懒我


更新:我现在记得几年前我尝试了同样的事情并遇到了同样的问题.我通过应用一个脏的解决方法(不是性能关键)修复了这个问题:我只是在SimpleXML和DOM之间转换,直到问题消失.我想转换摆脱了那些节点.也许加载dom,导入simplexml_import_dom,然后输出字符串,再次使用DOM解析,然后打印漂亮.据我记得这有效(但它确实很慢).

  • 我特此根据MIT许可条款在本回答中发布我的PHP代码版本.有它! (2认同)