Подтвердить что ты не робот

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

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

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

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

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

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

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

Follow Up:

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

4b9b3361

Ответ 1

вы правы, кажется, что нет отступов для 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 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 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 like comparing apples to oranges.</p>
  </body>
</html>

возможно забыл установить preserveWhiteSpace = false перед загрузкойHTML?

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


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

Ответ 3

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

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