PHP "красивая печать" HTML (не Tidy) - PullRequest
29 голосов
/ 20 апреля 2009

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

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

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

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

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

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

Продолжение:

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

Ответы [ 3 ]

29 голосов
/ 20 апреля 2009

вы правы, похоже, что для 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 . ленивый меня


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

6 голосов
/ 20 августа 2010

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

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

0 голосов
/ 13 августа 2012

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

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