2016-01-01 52 views
1

我有可變$html一個字符串,它包含縮小的HTML代碼,都在一個線,如:美化HTML保存在一個字符串在PHP

$html = '<body><div><p>hello</p><div></body>'; 

如何美化/漂亮的打印HTML,使我變量變得像:

$html = '<body> 
      <div> 
       <p>hello</p> 
      <div> 
      </body>'; 

我知道tidy擴展是可能的,但是這怎麼能不帶擴展名來完成。編輯:請閱讀問題。我不問如何通過外部網站美化HTML代碼。我正在問如何在PHP中實現它,特別是針對字符串變量。

+0

我一般將其粘貼到的jsfiddle和命中整潔按鈕。 –

+1

@AycanYaşıt當然,我們都有我們的方式,但我問如何使用PHP做到這一點,而不是jsfiddle。 :) –

+0

所以你尋找這樣的東西,對吧? http://php.net/manual/en/book.tidy。php –

回答

5

使用DomDocument我們加載HTML傳遞LIBXML_HTML_NOIMPLIED標誌
這將阻止loadHTML方法添加額外的html包裝。

我們另存爲XML以獲取好縮進,同時傳遞$dom->documentElement參數以防止XML標頭。

$html = '<body><div><p>hello</p><div></body>'; 

$dom = new DOMDocument(); 

$dom->preserveWhiteSpace = false; 
$dom->loadHTML($html,LIBXML_HTML_NOIMPLIED); 
$dom->formatOutput = true; 


print $dom->saveXML($dom->documentElement); 

這將輸出

<body> 
    <div> 
    <p>hello</p> 
    <div/> 
    </div> 
</body> 

注意,HTML固定你作爲第二div應該已經結束標籤,我想。

如果我們通過適當的HTML輸入字符串,輸出將根據您的需要

$html = '<body><div><p>hello</p></div></body>'; 

<body> 
    <div> 
    <p>hello</p> 
    </div> 
</body> 
+0

非常感謝。我結束了以下方法:http://pastebin.com/Q94UbgSW這是非常類似於你的。你做了什麼不同的事(或者更好)? –

+0

我剛剛檢查了你的函數的輸出,我發現它有'DOCTYPE'聲明和'html'標記包裝器。也沒有縮進。 –

+0

如果你的解決方案適合你,那麼使用它:)這是關於什麼最終適用於**你** –

0

雖然我不知道有任何預建簡單的事情,(大多數語法分析器提供的功能來縮小HTML,而不是美化它),它不應該是太難的事自己:

  1. 解析HTML。 DOMDocument可能是一個好主意。
  2. 通過文檔遞歸。對於每一個元素...
    1. 輸出的開始標記 - 你將需要遍歷屬性太
    2. 如果它不包含子元素(但可能子文本),輸出其textContent
      否則,遞歸進入元素,輸出每個子節點,無論是文本還是元素。根據遞歸級別數量適當縮進。
    3. 輸出結束標籤。

而且就是這樣。應該不會太困難:)