PHP «довольно печатать» HTML (не Tidy)

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

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

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

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

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

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

Следовать за:

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

вы правы, похоже, для HTML нет отступов ( другие также запутаны ). 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 = false перед загрузкойHTML?

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


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

Когда у меня была куча namespaced XML tidyHTML не понравилась, натолкнулась на это:

http://gdatatips.blogspot.com/2008/11/xml-php-pretty-printer.html

Вы можете использовать код для функции hl_tidy библиотеки htmLawed .

 // indent using one tab per indent, with all HTML being within an imaginary div $out = hl_tidy($in, 't', 'div')