我正在 PHP 中使用 DOM 扩展来构建一些 HTML 文档,并且我希望输出能够很好地格式化(使用换行符和缩进),以便它是可读的,但是,从我所做的许多测试来看:
- “formatOutput = true”根本不适用于 saveHTML(),仅适用于 saveXML()
- 即使我使用了 saveXML(),它仍然只适用于通过 DOM 创建的元素,而不适用于 loadHTML() 中包含的元素,即使使用“preserveWhiteSpace = false”
如果有人有不同的了解,我真的很想知道他们是如何让它发挥作用的。
因此,我有一个 DOM 文档,并且使用 saveHTML() 来输出 HTML。由于它来自 DOM,我知道它是有效的,因此不需要“整理”或以任何方式验证它。
我只是在寻找一种方法,从 DOM 扩展收到的输出中获取格式良好的输出。
注意。正如您可能已经猜到的,我不想使用 Tidy 扩展,因为 a) 它做了很多我需要的事情(标记已经有效),b) 它实际上对 HTML 内容进行了更改(例如HTML 5 文档类型和一些元素)。
跟进:
好的,在下面的答案的帮助下,我已经弄清楚了 DOM 扩展不起作用的原因。尽管给定的示例有效,但它仍然不适用于我的代码。在...的帮助下this https://www.php.net/manual/en/domdocument.savexml.php#76867我发现,如果您有任何文本节点,其中 isWhitespaceInElementContent() 为 true,则不会应用超出该点的格式。无论preserveWhiteSpace 是否为假,都会发生这种情况。解决方案是删除所有这些节点(尽管我不确定这是否会对实际内容产生不利影响)。
你是对的,HTML 似乎没有缩进(其他人也很困惑 http://bugs.php.net/bug.php?id=27783)。即使加载了代码,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();
?>
result:
<!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 手册注释 http://www.php.net/manual/en/domdocument.savehtml.php#52139。懒惰的我。
UPDATE:我现在记得几年前我尝试过同样的事情并遇到了同样的问题。我通过应用一个肮脏的解决方法解决了这个问题(不是性能关键):我只是以某种方式在 SimpleXML 和 DOM 之间进行转换,直到问题消失。我想转换摆脱了这些节点。也许加载 dom,导入simplexml_import_dom
,然后输出字符串,再次用 DOM 解析它并then打印得很漂亮。据我记得这有效(但它是really slow).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)