php DomDocument添加了额外的标签

时间:2011-01-26 00:45:20

标签: php dom domdocument

我正在尝试解析文档并获取所有图像标记并更改不同内容的来源。


    $domDocument = new DOMDocument();

    $domDocument->loadHTML($text);

    $imageNodeList = $domDocument->getElementsByTagName('img');

    foreach ($imageNodeList as $Image) {
      $Image->setAttribute('src', 'lalala');
      $domDocument->saveHTML($Image);
    }

    $text = $domDocument->saveHTML();

$ text最初看起来像这样:


<p>Hi, this is a test, here is an image<img src="http://mysite.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>

这是输出$ text:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hi, this is a test, here is an image<img src="lalala" width="68" height="95"> Because I like Beer!</p></body></html>

我得到了一堆我不需要的额外标签(html,正文和顶部的评论)。有没有办法设置DOMDocument以避免添加这些额外的标签?

谢谢!

5 个答案:

答案 0 :(得分:12)

您只需要向loadHTML()方法添加2个标记:LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD。即。

$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);

请参阅IDEONE demo

$text = '<p>Hi, this is a test, here is an image<img src="http://example.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>';
$domDocument = new DOMDocument;
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
$imageNodeList = $domDocument->getElementsByTagName('img');

foreach ($imageNodeList as $Image) {
      $Image->setAttribute('src', 'lalala');
      $domDocument->saveHTML($Image);
}

$text = $domDocument->saveHTML();
echo $text;

输出:

<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p>

答案 1 :(得分:4)

不幸的是,DomDocument被延迟了,不会让你这么做。试试这个:

$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domDocument->saveHTML()));

答案 2 :(得分:1)

如果你是一个黑客,这就是我设法解决这个烦恼的方式。将字符串加载为XML并将其另存为HTML。 :)

答案 3 :(得分:0)

您可以使用http://beerpla.net/projects/smartdomdocument-a-smarter-php-domdocument-class/

DOMDocument有一个设计极其糟糕的“功能”,如果你加载的HTML代码不包含和标签,它会自动添加它们(是的,没有标志可以关闭此行为)。

因此,当您调用$ doc-&gt; saveHTML()时,您新保存的内容现在包含了DOCTYPE。尝试使用代码片段时不是很方便(XML有类似的问题)。

SmartDOMDocument包含一个名为saveHTMLExact()的新函数,它可以完全满足您的需要 - 它可以保存HTML而不会添加DOMDocument所做的额外垃圾。

答案 4 :(得分:-1)

如果您要另存为HTML,则必须要创建一个有效的HTML文档!

还有另一种选择:DOMDocument::saveXML有一个可选参数,允许您访问特定元素的XML内容:

$el = $domDocument->getElementsByTagName('p')->item(0);
$text = $domDocument->saveXML($el);

这假设您的内容只有一个p元素。