如何使用DOMDocument修复此缩进问题?

时间:2011-04-19 23:05:53

标签: php formatting domdocument

我刚开始使用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: &ouml;&auml;&uuml; &Ouml;&Auml;&Uuml; &szlig; 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>

我已尝试设置preserveWhiteSpaceformatOutput,但这不会改变任何内容。

这根本不是什么大问题,但如果输出看起来像输入那就好了。

任何想法如何解决这个问题?

还有一个问题:在我添加了\n的另一个节点后,有没有办法手动插入appendChild()换行符?

2 个答案:

答案 0 :(得分:2)

使用DOM重新格式化文档的正确方法是

$dom = new DOMDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->loadHTMLFile("test.html");
$dom->formatOutput = TRUE;
$dom->saveHTMLFile("templates/test_neu.html");

如果这不会产生所需的输出,您仍然可以自己添加空格。用于格式化的任何空格都是DOMText节点。看我的答案

有更详细的解释。另一种方法是使用Tidy重新格式化代码或https://stackoverflow.com/search?q=html+beautifier+php

中建议的任何工具

答案 1 :(得分:0)

在寻找缩进XSLTProcessor输出的解决方案时遇到了这个问题。这是一种不合理的替代方法,可能会节省一些时间:

$xml -> preserveWhiteSpace = false;
$xml -> formatOutput = true;

$html = $xml -> saveXML();
$html = strstr( $html, '<html' );

file_put_contents( 'output.html', $html );

在任何情况下,对我来说任何其他配置都不起作用。