我如何解析部分HTML?

wai*_*933 18 html php parsing dom

我正在尝试用PHP解析一些带有DOM的HTML,但是我遇到了一些问题.首先,如果这改变了解决方案,我所拥有的HTML不是一个完整的页面,而是它只是它的一部分.

<!-- This is the HTML that I have --><a href='/games/'>
<div id='game'>
<img src='http://images.example.com/games.gif' width='300' height='137' border='0'>
<br><b> Game </b>
</div>
<div id='double'>
<img src='http://images.example.com/double.gif' width='300' height='27' border='0' alt='' title=''>
</div>
</a>
Run Code Online (Sandbox Code Playgroud)

现在我试图只获得带有id的div double.我已经尝试了以下代码,但它似乎没有正常工作.我可能做错了什么?

//The HTML has been loaded into the variable $html
$dom=new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false; 
$keepme = $dom->getElementById('double'); 

$contents = '<div style="text-align:center">'.$keepme.'</a></div>';
echo $contents;
Run Code Online (Sandbox Code Playgroud)

Pas*_*TIN 13

我想DOMDocument::getElementById在你的情况下不会起作用:( 引用)

要使此功能起作用,您需要使用DOMElement::setIdAttribute或使用DTD 设置一些ID属性,DTD将属性定义为ID类型.
在后一种情况下,您需要在使用此功能时DOMDocument::validateDOMDocument->validateOnParse之前验证您的文档.


可能有效的解决方案是使用一些XPath查询来提取您要查找的元素.

首先,让我们像你第一次一样加载HTML部分:

$dom=new domDocument;
$dom->loadHTML($html);
var_dump($dom->saveHTML());
Run Code Online (Sandbox Code Playgroud)

var_dump只在这里证明HTML部分已成功加载-从它的输出来看,它有.


然后,实例化DOMXPath该类,并使用它来查询您想要获取的元素:

$xpath = new DOMXpath($dom);
$result = $xpath->query("//*[@id = 'double']");
$keepme = $result->item(0);
Run Code Online (Sandbox Code Playgroud)

我们现在必须要你想要的元素;-)


但是,为了将HTML内容注入另一个HTML段,我们必须首先获取其HTML内容.

我不记得任何"简单"的方法,但这样的事情可以做到这一点:

$tempDom = new DOMDocument();
$tempImported = $tempDom->importNode($keepme, true);
$tempDom->appendChild($tempImported);
$newHtml = $tempDom->saveHTML();
var_dump($newHtml);
Run Code Online (Sandbox Code Playgroud)

而且......我们有你的HTML内容double <div>:

string '<div id="double">
<img src="http://images.example.com/double.gif" width="300" height="27" border="0" alt="" title="">
</div>
' (length=125)
Run Code Online (Sandbox Code Playgroud)


现在,你只需要做任何你想做的事情;-)