我刚开始使用DOMDocument对象,因为我想解析一个上传的HTML文件,然后使用它作为我的cms模板。
我从一个文件加载HTML,为了测试的目的-保存为一个新的HTML文件,不改变任何东西。问题是:缩进搞砸了。
我的HTML文件是这样的:
<!DOCTYPE html>
<html>
<head>
<title>DOM Testpage</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="language" content="deutsch, de" />
</head>
<body>
<div class="pageOverlay"></div>
<div style="height:100px;"></div>
<div id="LoginForm">
<div id="LoginLogo">
Here's some Text
<br />
And another Text with some German Umlauts: öäü ÖÄÜ ß and so on...
<br />
</div>
<form method="post" action="">
<!-- Here be dragons. And a nice comment -->
<input type="text" name="cms_user" value="" class="InputText " data-defaultvalue="Username" title="Please enter your username." style="margin:0px 0px 20px 0px;" />
<input type="password" name="cms_password" value="" class="InputText " data-defaultvalue="Password" title="Please enter your password." style="margin:0px 0px 20px 0px;" />
<input type="checkbox" name="cms_remember_login" value="1" id="cms_remember_login" />
<label for="cms_remember_login" style="line-height:14px; margin-left:5px;">Remember Login</label>
<!-- Another comment
This one's even
longer -->
<input type="submit" name="submitLogin" value="Login" />
</form>
</div>
</body>
</html>
PHP:
<?php
$lo_dom = new DOMDocument();
$lo_dom->loadHTMLFile("test.html");
$lo_dom->saveHTMLFile("templates/test_neu.html");
?>
当我打开新的HTML文件时,源代码看起来像这样:
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>DOM Testpage</title><meta name="language" content="deutsch, de"></head><body>
<div class="pageOverlay"></div>
<div style="height:100px;"></div>
<div id="LoginForm">
<div id="LoginLogo">
Here's some Text
<br>
And another Text with some German Umlauts: öäü ÖÄÜ ß and so on...
<br></div>
<form method="post" action="">
<!-- Here be dragons. And a nice comment -->
<input type="text" name="cms_user" value="" class="InputText " data-defaultvalue="Username" title="Please enter your username." style="margin:0px 0px 20px 0px;"><input type="password" name="cms_password" value="" class="InputText " data-defaultvalue="Password" title="Please enter your password." style="margin:0px 0px 20px 0px;"><input type="checkbox" name="cms_remember_login" value="1" id="cms_remember_login"><label for="cms_remember_login" style="line-height:14px; margin-left:5px;">Remember Login</label>
<!-- Another comment
This one's even
longer -->
<input type="submit" name="submitLogin" value="Login"></form>
</div>
</body></html>
我已经尝试设置preserveWhiteSpace
和formatOutput
,但这没有改变任何东西。
这不是什么大问题,但如果输出看起来像输入就好了。
有什么办法解决这个问题吗?
和另一个问题:是否有一种方法手动插入'n
换行后,我添加了另一个节点与appendChild()
?
用DOM重新格式化文档的正确方法是
$dom = new DOMDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->loadHTMLFile("test.html");
$dom->formatOutput = TRUE;
$dom->saveHTMLFile("templates/test_neu.html");
如果没有得到想要的输出,您仍然可以自己添加空格。任何用于格式化目的的空白都是DOMText
节点。请看我的回答
- DOMDocument在php和
- 使用XML DOM打印XML文件的内容
查看更详细的解释。另一种替代方法是使用Tidy重新格式化代码,或者使用https://stackoverflow.com/search?q=html+beautifier+php
在寻找缩进XSLTProcessor输出的解决方案时遇到了这个问题。这里有一个不太优雅的替代方法,可能会节省一些时间:
$xml -> preserveWhiteSpace = false;
$xml -> formatOutput = true;
$html = $xml -> saveXML();
$html = strstr( $html, '<html' );
file_put_contents( 'output.html', $html );