2011-01-26 108 views
9

我想解析一个文档,并获取所有图像标签,并更改不同的东西来源。php 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(); 
 

的$文本最初看起来是这样的:


<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>

,这是输出$文字:


<!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

DomDocument是不幸的智障,不会让你这样做。试试这个:

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

它应该是:$ text = preg_replace('/^ /','',str_replace(array('','','',''),array('','',' ',''),$ domDocument-> saveHTML())); – 2011-05-14 06:58:13

+0

`preg_replace`,真的吗? – sglessard 2017-09-15 16:52:45

-1

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

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

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

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

+0

取决于文档中所使用的元素并不总是使用saveXML一个好主意()来检索HTML源。创建的XML将使用所有没有内容的元素的简写,会损坏HTML文档(例如`

10

你只需要添加2个标志loadHTML()方法: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>