PHP "красивый печатный" HTML (не аккуратный)


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

  1. "formatoutput = true" вообще не работает с saveHTML(), только saveXML()
  2. Даже если бы я использовал saveXML(), он все равно работает только с элементами, созданными с помощью DOM, а не с элементами, включенными в loadHTML(), даже с "PreserveWhitespace= ложь"

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

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

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

ПРИМЕЧАНИЕ. Как вы, наверное, догадались, я не хочу пользоваться Приборкой расширение как а) оно делает намного больше, чем мне нужно (разметка уже действительна), и б) оно фактически вносит изменения в содержимое HTML (например, тип документа HTML 5 и некоторые элементы).

Последующие Действия:

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

Author: Jack Sleight, 2009-04-20

3 answers

Вы правы, похоже, для 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?

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


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

 29
Author: stefs, 2014-07-05 12:51:25

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

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

 5
Author: Garvin, 2010-08-20 19:54:38

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

// indent using one tab per indent, with all HTML being within an imaginary div
$out = hl_tidy($in, 't', 'div')
 0
Author: user594694, 2012-08-13 14:37:01