Как предотвратить добавление doctype в HTML? - PullRequest
3 голосов
/ 28 июля 2011

Я работал над этими тегами tidy-up-messy-html с DOM, но теперь я осознаю большую проблему:

$content = '<p><a href="#">this is a link</a></p>';

function tidy_html($content,$allowable_tags = null, $span_regex = null)
{      
    $dom = new DOMDocument();
    $dom->loadHTML($content);

        // other codes
    return $dom->saveHTML();
}

echo tidy_html($content);

Он выведет весь DOM,

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><p><a href="#">this is a link</a></p></body></html> 

но я хочу только что-то подобное в ответе,

<p><a href="#">this is a link</a></p>

Я не хочу,

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
    <html><body>...</body></html>

Возможно ли это?

РЕДАКТИРОВАТЬ:

симуляция innerHTML генерирует некоторые странные коды в моей базе данных, такие как &#13;, Â, ’

<p>Monday July 5th 10am - 3.30pm £20</p>&#13;
<p>Be one of the first visitors to the ...at this special event.Â</p>&#13;
<p>All participants will receive a free copy of the ‘Contemporary Art Kit’ produced exclusively for Art on....</p>&#13;

innerHTML симуляция,

$innerHHTML = '';
$nodeBody = $dom->getElementsByTagName('body')->item(0);
foreach($nodeBody->childNodes as $child) {
  $innerHTML .= $nodeBody->ownerDocument->saveXML($child);
}

Я обнаружил, что причина, по которой он создает странные коды при разрыве, вызвана saveXML($child)

Поэтому, когда у меня что-то подобное,

$content = '<p><br/><a href="#">xx</a></p>
<p><br/><a href="#">xx</a></p>';

Будет возвращено что-то вроде этого,

<p><a href="#">xx</a></p>&#13;
<p><a href="#">xx</a></p>

Но я хочу что-то такое на самом деле,

<p><a href="#">xx</a></p>
<p><a href="#">xx</a></p>

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Если вы работаете с фрагментом, вам обычно требуется только содержимое тела.

DomDocument в PHP не предлагает что-то вроде innerHTML. Однако вы можете смоделировать это:

$innerHHTML = '';
$nodeBody = $dom->getElementsByTagName('body')->item(0);
foreach($nodeBody->childNodes as $child) {
  $innerHTML .= $nodeBody->ownerDocument->saveXML($child);
}

Если вы просто хотите восстановить фрагмент, вы также можете использовать аккуратную библиотеку :

$html = tidy_repair_string($html, array('output-xhtml'=>1,'show-body-only'=>1));
0 голосов
/ 28 июля 2011

Хакре уже упомянул опцию show-body-only в HTML Tidy, что, вероятно, то, что вам нужно.

Ps. Вот файл конфигурации Tidy, используемый MediaWiki для этой цели.

...