我一直在使用DOM处理这个tidy-up-messy-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模拟会在我的数据库中生成一些奇怪的代码,例如 ,Â,’
<p>Monday July 5th 10am - 3.30pm £20</p>
<p>Be one of the first visitors to the ...at this special event.Â</p>
<p>All participants will receive a free copy of the ‘Contemporary Art Kit’ produced exclusively for Art on....</p>
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>
<p><a href="#">xx</a></p>
但我实际上想要这样的东西
<p><a href="#">xx</a></p>
<p><a href="#">xx</a></p>
解决方法:
如果您正在处理片段,通常只需要正文内容.
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));