PHP文档添加了额外的标记

PHP文档添加了额外的标记,php,dom,domdocument,Php,Dom,Domdocument,我试图解析一个文档,获取所有的图像标签,并为不同的内容更改源代码 $domDocument=新的domDocument(); $domDocument->loadHTML($text); $imageNodeList=$domDocument->getElementsByTagName('img'); foreach($imageNodeList作为$Image){ $Image->setAttribute('src','lalala'); $domDocument->saveHTML($Ima

我试图解析一个文档,获取所有的图像标签,并为不同的内容更改源代码

$domDocument=新的domDocument();
$domDocument->loadHTML($text);
$imageNodeList=$domDocument->getElementsByTagName('img');
foreach($imageNodeList作为$Image){
$Image->setAttribute('src','lalala');
$domDocument->saveHTML($Image);
}
$text=$domDocument->saveHTML();
$text
最初看起来如下:

你好,这是一个测试,这是一张图片,因为我喜欢啤酒

这是输出
$text


嗨,这是一个测试,这是一张图片,因为我喜欢啤酒


我得到了一堆我并不真正需要的额外标签(HTML、正文和顶部的注释)。如何设置
DOMDocument
以避免添加这些额外的标记?

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

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

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

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

如果您正在进行黑客攻击,这就是我设法绕过这一烦恼的方法。将字符串加载为XML并另存为HTML:)

不幸的是,DomDocument被延迟,不允许您这样做。试试这个:

$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domDocument->saveHTML()));
$text=preg_replace('/^/','',str_replace(数组('',''),数组('',''),$domDocument->saveHTML());
您可以使用:

DOMDocument有一个设计极其糟糕的“特性”,如果您正在加载的HTML代码不包含和标记,它会自动添加它们(是的,没有关闭此行为的标志)

因此,当您调用$doc->saveHTML()时,新保存的内容中现在有和DOCTYPE。在尝试处理代码片段时,这不是很方便(XML也有类似的问题)


SmartDOMDocument包含一个名为saveHTMLExact()的新函数,该函数的功能完全符合您的需要–它可以保存HTML,而无需添加DOMDocument所做的额外垃圾。

您只需向
loadHTML()
方法添加两个标志:
LIBXML\u HTML\u NOIMPLIED | LIBXML\u HTML\u NODEFDTD
。即

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

$text='嗨,这是一个测试,这是一张图片,因为我喜欢啤酒

",; $domDocument=新的domDocument; $domDocument->loadHTML($text,LIBXML\u HTML\u noimpled | LIBXML\u HTML\u NODEFDTD); $imageNodeList=$domDocument->getElementsByTagName('img'); foreach($imageNodeList作为$Image){ $Image->setAttribute('src','lalala'); $domDocument->saveHTML($Image); } $text=$domDocument->saveHTML(); echo$文本;
输出:

<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p>
你好,这是一个测试,这是一张图片,因为我喜欢啤酒


根据文档中使用的元素,使用saveXML()检索HTML源并不总是一个好主意。创建的XML将使用简写来表示所有不包含内容的元素,这将损坏HTML文档(例如
)。您需要解析结果并对其进行更正或使用XSLT对其进行转换,以获得有效的HTML文档。它应为:$text=preg_replace('/^/','',str_replace(数组('','',''),数组('','',''),$domDocument->saveHTML())
preg_replace
,真的吗?对我来说,这只是去除了所有html。我的段落也不见了。@Mike:这是不可能的,因为代码没有删除任何内容。可能您的HTML不是完全有效的。尝试添加
libxml\u-use\u-internal\u错误(true)$DOMDocument=new DOMDocument初始化DOMDocument之前的code>
@WiktorStribiżew我使用它从文本字段中删除脚本标记,如下所示:这应该是可以接受的答案
<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p>