如何防止doctype添加到HTML中?

3

我一直在使用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>

I don't want,

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

这是可能的吗??
编辑:
innerHTML模拟在我的数据库中生成一些奇怪的代码,如 ,Â,’。
<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
如果你正在处理一个片段,通常只需要内容主体。
在PHP中,DomDocument没有提供类似于innerHTML的东西。但是,你可以模拟它:
$innerHHTML = '';
$nodeBody = $dom->getElementsByTagName('body')->item(0);
foreach($nodeBody->childNodes as $child) {
  $innerHTML .= $nodeBody->ownerDocument->saveXML($child);
}

如果您只想修复一个片段,您也可以利用 tidy 库
$html = tidy_repair_string($html, array('output-xhtml'=>1,'show-body-only'=>1));

明白了,谢谢!不过我不知道如何将tidy_repair_string整合到我的代码中...不过innerHTML的模拟效果完美! - Run
刚刚发现 innerHTML 模拟生成了一些奇怪的东西。请参见我上面的编辑。谢谢。 - Run
这看起来像是你这边的编码问题。确保你只将UTF-8编码的字符串传入DomDocument中。在此之前,你也可以规范化换行符。不过,你应该了解一下tidy库,它有多年的经验,并且也处理编码和换行符。 - hakre
我使用 tidy_repair_string() 来解决这个问题 $fragment = tidy_repair_string($dom->saveHTML(), array('output-xhtml'=>1,'show-body-only'=>1)); return $fragment; - Run
我必须确保服务器已经开启了 php_tidy。这可能是一个问题,因为一些实际运行的服务器可能没有进行配置... - Run

0
Hakre已经提到了HTML Tidy的show-body-only选项,这可能是你想要的。
附注:这里是MediaWiki使用的Tidy配置文件,几乎只用于此目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接