gpt4 book ai didi

PHP "pretty print"HTML(不整洁)

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:54 24 4
gpt4 key购买 nike

我在 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/14003660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com