如何防止将doctype添加到HTML?

时间:2011-07-27 21:45:02

标签: php xpath domdocument doctype

我一直在用DOM制作这个整洁的HTML标签,但现在我意识到了一个更大的问题,

$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 个答案:

答案 0 :(得分:3)

如果您正在处理片段,通常只需要正文内容。

PHP中的DomDocument不提供innerHTML之类的东西。你可以模拟它:

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

如果您只想修复片段,也可以使用tidy library

$html = tidy_repair_string($html, array('output-xhtml'=>1,'show-body-only'=>1));

答案 1 :(得分:0)

Hakre已经提到了HTML Tidy的show-body-only选项,这可能是你想要的。

聚苯乙烯。 Here's MediaWiki使用的Tidy配置文件几乎就是为了这个目的。