PHP "pretty print"HTML(不整洁)

标签 php html format tidy

我在 PHP 中使用 DOM 扩展来构建一些 HTML 文档,并且我希望输出的格式很好(使用换行符和缩进)以便它可读,但是,从我完成的许多测试来看:

  1. “formatOutput = true”根本不适用于 saveHTML(),仅适用于 saveXML()
  2. 即使我使用了 saveXML(),它仍然只适用于通过 DOM 创建的元素,而不是包含在 loadHTML() 中的元素,即使使用“preserveWhiteSpace = false”也是如此

如果有人有不同的看法,我真的很想知道他们是如何让它发挥作用的。

所以,我有一个 DOM 文档,我正在使用 saveHTML() 来输出 HTML。由于它来自 DOM,我知道它是有效的,因此无需“整理”或以任何方式验证它。

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

注意。正如您可能已经猜到的那样,我不想使用 Tidy 扩展,因为 a) 它做了很多我需要的东西(标记已经有效)和 b) 它实际上对 HTML 内容进行了更改(例如HTML 5 文档类型和一些元素)。

跟进:

好的,在下面的答案的帮助下,我已经弄清楚了为什么 DOM 扩展不起作用。尽管给定的示例有效,但它仍然不适用于我的代码。在this的帮助下评论 我发现,如果您有任何文本节点,其中 isWhitespaceInElementContent() 为真,则不会应用超出该点的格式。无论 preserveWhiteSpace 是否为 false,都会发生这种情况。解决方案是删除所有这些节点(虽然我不确定这是否会对实际内容产生不利影响)。

最佳答案

你是对的,HTML 似乎没有缩进(others are also confused)。即使加载代码,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>

可能忘记在加载 HTML 之前设置 preserveWhiteSpace=false?

disclaimer: i stole most of the demo code from tyson clugg/php manual comments. lazy me.


UPDATE: i now remember some years ago i tried the same thing and ran into the same problem. i fixed this by applying a dirty workaround (wasn't performance critical): i just somehow converted around between SimpleXML and DOM until the problem vanished. i suppose the conversion got rid of those nodes. maybe load with dom, import with simplexml_import_dom, then output the string, parse this with DOM again and then printed it pretty. as far as i remember this worked (but it was really slow).

关于PHP "pretty print"HTML(不整洁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/768215/

相关文章:

javascript - 如何在java脚本中制作倒数计时器,它不应该在页面重新加载时重置

sas - SAS 中的大数异常

php - ActionScript从php加载外部声音文件,并从php响应中找出实际的文件名?

php - 与 mysql 的左连接问题

javascript - 一键获取模态图像

vbscript - 如何在vbscript中的数字变量中的3位数字后添加逗号?

Python 2.6+ str.format() 和正则表达式

php - 如何生成.po 文件?

javascript - 在表格顶部 float <div> 元素?

javascript - &lt;script&gt; 中的 Struts html 标记