2009-04-20 23 views
27

PHPでDOM拡張を使用してHTMLドキュメントを作成していますが、出力を読みやすくするために新しい行とインデントを使用して出力したい、私がやった多くのテストから:PHP「きれいな印刷」HTML(Tidyではない)

  1. "formatOutputは=真"(saveHTMLでまったく動作しない)、のみsaveXML()
  2. 私はsaveXML()、それはまだのみを使用した場合でも"preserveWhiteSpace = false"であっても、loadHTML()に含まれる要素ではなく、DOMを介して作成された要素に作用します。

誰かが違ったことを知っていたら、どうやって彼らが働くか知りたいと思っています。

DOMドキュメントがあり、HTMLを出力するためにsaveHTML()を使用しています。それが有効であることを私が知っているDOMから来ているので、何らかの方法でそれを "整頓"するか検証する必要はありません。

私はDOM拡張から受け取った出力からきれいにフォーマットされた出力を得る方法を探しています。

NB。あなたが推測しているかもしれませんが、私はTidyエクステンションをa)もっと必要とします(マークアップはすでに有効です)。b)​​実際にHTMLコンテンツを変更します。 HTML 5のdoctypeといくつかの要素)。

フォローアップ:DOM拡張が動作しなかった理由

OK、答えの助けを借りて、私が出て働いてきたの下に。与えられた例は動作しますが、それでも私のコードでは動作しませんでした。 thisコメントの助けを借りて、isWhitespaceInElementContent()が真であるテキストノードがあれば、そのポイントを超えて書式設定が適用されないことがわかりました。これは、preserveWhiteSpaceがfalseであるかどうかにかかわらず発生します。解決策は、これらのノードをすべて削除することです(実際のコンテンツに悪影響を及ぼすかどうかはわかりませんが)。

答えて

29

あなたが正しいですが、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(); 
?> 

結果:saveXML(と

<!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> 

同じ)...

<?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 =を設定するのを忘れ?

免責事項:私はtyson clugg/php manual commentsからデモコードのほとんどを盗んだ。怠惰な私。


UPDATE:私は今、数年前に覚えて、私は同じことを試してみましたが、同じ問題に遭遇しました。私はこれを修正しました。(パフォーマンスは重要ではありませんでした)汚れた回避策を適用しました。問題がなくなるまで、何とかSimpleXMLとDOMの間を変換しました。私は変換がそれらのノードを取り除いたと思います。おそらくdomでロードし、simplexml_import_domでインポートし、文字列を出力し、DOMでこれを再度解析し、を次にかなり印刷しました。限り、私はこれが働いたことを覚えている(しかし、それは本当に遅いでした)。

+0

ありがとうございます。あなたの例とphp.netのコメントで私は問題を解決しました(上記のフォローアップを参照)。 –

+0

DOMのソリューションはかなり重いようです。それはどれくらい速いか遅いですか?より小さなスニペットで、またはページ全体でのみ使用する価値がありますか? – sumid

+0

''のような値を持たないタグで 'saveXML()'を使うときに問題があります。 '