php DomDocument添加了额外的标签

One*_*ema 9 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>

Run Code Online (Sandbox Code Playgroud)

这是输出$ 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>

Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Wik*_*żew 17

您只需要为方法添加2个标志loadHTML():LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD.即

$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
Run Code Online (Sandbox Code Playgroud)

请参阅IDEONE演示:

$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;
Run Code Online (Sandbox Code Playgroud)

输出:

<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p>
Run Code Online (Sandbox Code Playgroud)

  • 这工作,应该是最好的答案.谢谢. (3认同)

小智 5

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

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

  • `preg_replace`,真的吗? (2认同)