如何解析部分 HTML?

2022-08-30 22:23:32

我试图在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>

现在我试图只得到带有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;

答案 1

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

要使此函数正常工作,您需要设置一些 ID 属性,或者设置一个 DTD,将属性定义为 ID 类型。
在后面的情况下,您需要使用此功能验证文档,或者在使用此函数之前验证文档。DOMElement::setIdAttributeDOMDocument::validateDOMDocument->validateOnParse


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

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

$dom=new domDocument;
$dom->loadHTML($html);
var_dump($dom->saveHTML());

这里只是为了证明HTML部分已成功加载 - 从其输出来看,它已经加载了。var_dump


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

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

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


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

我不记得有任何“简单”的方法可以做到这一点,但是像这样有灵魂的东西可以做到这一点:

$tempDom = new DOMDocument();
$tempImported = $tempDom->importNode($keepme, true);
$tempDom->appendChild($tempImported);
$newHtml = $tempDom->saveHTML();
var_dump($newHtml);

和。。。我们有您的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)


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


答案 2

From DomDocument::getElementById

要使此函数正常工作,您需要使用 DOMElement::setIdAttribute 或 DTD(将属性定义为 ID 类型)设置一些 ID 属性。在后面的例子中,在使用此函数之前,您需要使用 DOMDocument::validate 或 DOMDocument->validateOnParse 来验证您的文档。

有关一些其他信息

由于有人迟早会提到使用正则表达式执行此操作,因此您可以使用以下模式:/<div id='double'>(.*)<\/div>/simU

此外,您可以使用常规字符串函数来提取div部分,例如

$div = strstr($html, '<div id="double">');
$div = substr($div, 0, strpos($div, '</div>') + 6);
echo $div;

虽然我同意,你不应该使用正则表达式或字符串函数来解析HTML或XML,但我发现这样做绝对是可以的,只要你唯一关心的是从片段中获取这个单独的div。保持简单。


推荐