2009-04-20 3 views
27

Я использую расширение DOM в PHP для создания некоторых HTML-документов, и я хочу, чтобы результат был отформатирован красиво (с новыми строками и отступом), чтобы он был доступен для чтения от многих тестов я сделал:PHP «pretty print» HTML (not Tidy)

  1. "formatOutput = истина" не работает вообще с saveHTML(), только saveXML()
  2. Даже если я использовал saveXML(), она до сих пор только работает над элементами, созданными с помощью DOM, а не элементами, которые входят в loadHTML(), даже с «preserveWhiteSpace = false»

Если кто-то знает по-другому, мне бы очень хотелось узнать, как они наняли его.

Итак, у меня есть документ DOM, и я использую saveHTML() для вывода HTML. Поскольку это происходит из DOM, я знаю, что это действительно так, нет необходимости «убирать» или проверять его каким-либо образом.

Я просто ищу способ получить красиво отформатированный вывод с вывода, получаемого с расширения DOM.

NB. Как вы могли догадаться, я не хочу использовать расширение Tidy как a) он делает намного больше, что мне тоже нужно (разметка уже допустима), и b) она фактически вносит изменения в содержимое HTML (например, HTML-тип и некоторые элементы).

Follow Up:

ОК, с помощью ответа ниже я работал, почему расширение DOM не работает. Хотя данный пример работает, он все еще не работал с моим кодом. С помощью комментария this я обнаружил, что если у вас есть текстовые узлы, где isWhitespaceInElementContent() истинно, форматирование не будет применяться после этой точки. Это происходит независимо от того, является ли сохранениеWhiteSpace ложным. Решение состоит в том, чтобы удалить все эти узлы (хотя я не уверен, что это может отрицательно сказаться на фактическом содержании).

ответ

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(); 
?> 

результат:

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

вероятно забыли установить preserveWhiteSpace = ложь, прежде чем loadHTML?

отказ от ответственности: я украл большую часть демонстрационного кода от tyson clugg/php manual comments. ленивый.


UPDATE: я помню сейчас несколько лет назад я попробовал то же самое и столкнулся с той же проблемой. Я исправил это, применив грязное обходное решение (не критично для производительности): я как-то конвертировал между SimpleXML и DOM, пока проблема не исчезла. я полагаю, что преобразование избавилось от этих узлов.возможно, загрузите с dom, импортируйте с simplexml_import_dom, затем выведите строку, проанализируйте это с помощью DOM снова и , затем напечатайте его довольно. насколько я помню, это сработало (но это было действительно slow).

+0

Спасибо. С вашими примерами и комментариями на php.net я разработал проблему (см. Выше). –

+0

Решение с DOM кажется мне совершенно тяжеловесным. Как быстро или медленно? Стоит ли использовать его также на небольших фрагментах или только на всей странице? – sumid

+0

Существует проблема при использовании 'saveXML()' с некоторыми тегами без значения, например '' он преобразует его в '