用php dom输出错误

时间:2015-01-20 17:31:21

标签: php html dom utf-8

我有一个简单丰富的utf-8文本:

$content = '<p> a simple <a href="http://unicode.com"> UTF-8</a> text.
                  <img src ="http://unicode.com/pic.jpeg" /></p>'

所以我想用php dom改变src值:

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
$imgs = $doc->getElementsByTagName('img');
 $newsrc = 'http://unicode.com/pic.png';
foreach ($imgs as $img) 
{
     $img->setAttribute('src', $newsrc);
}
$content = $doc->saveHTML();
echo $content;

我输出结果除外:

<p> a simple <a href="http://unicode.com"> UTF-8</a> text.
                  <img src ="http://unicode.com/pic.png" /> </p>

但我得到这样的东西:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body>6;&#1585<p><a href="http://unicode.com">&#1608;&#1740; &#1662;&#1575;&#1585;&#1587;: </a>
&#1662;&#1575;&#1740;&#1711;&#1575;&#1607;
<img src="http://unicode.com/pic.png" /></p></body></html>

现在我不想要任何额外的标签,如DOCTYPE,html,body,...... 而且我希望普通字符不像&#1711;就像那样。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

PHP 5.4+可以实现这一点。只需将LIBXML_HTML_NODEFDTDLIBXML_HTML_NOIMPLIED标记传递给DOMDocument::loadHTML

即可
$doc->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);

如果PHP 5.4+不适合您,请参阅DOMDocument::saveHTML comments了解替代解决方案。