与之前在这里问过的其他人类似的问题,但由于我不知道如何应用这些建议,所以我需要一些帮助。
我想找到一个 html 文档的节点,其结构如下(摘录,可能有所不同):
<h2>My title 1</h2>
<h3>Sub-heading</h3>
<p>...<span><a href='#'>...</a></span></p>
<div>...</div>
<h2>My title 2</h2>
<p>No sub-heading here :O</p>
<h3>But here</h3>
<p>No link</p>
<h2>And so on...</h2>
<p>...</p>
我想要完成的是找到从一个 h2 到下一个 h2 之前的最后一项的所有节点,包括 h2 本身。就像在我的例子中一样,我想检索像这样的“块”:
Block 1:
<h2>My title 1</h2>
<h3>Sub-heading</h3>
<p>...<span><a href='#'>...</a></span></p>
<div>...</div>
Block 2:
<h2>My title 2</h2>
<p>No sub-heading here :O</p>
<h3>But here</h3>
<p>No link</p>
Block 3:
<h2>And so on...</h2>
<p>...</p>
除了 h2 之外,我没有任何其他目标(没有 id、没有我可以知道的文本内容、没有确定的内容等)。
您可以使用DOMXpath http://php.net/manual/en/class.domxpath.php and query http://php.net/manual/en/domxpath.query.php method.
首先从body中找到所有h2元素(不是嵌套的h2元素)
然后开始一个foreach
循环查找每个 h2。
然后将 h2 添加到数组中$set
因为你想保存它。
然后循环兄弟姐妹并将它们添加到数组中$set
直到您找到的下一个 h2。
Add $set
to $sets
array.
例如:
$html = <<<HTML
<h2>My title 1</h2>
<h3>Sub-heading</h3>
<p>...<span><a href='#'>...</a></span></p>
<div>...</div>
<h2>My title 2</h2>
<p>No sub-heading here :O</p>
<h3>But here</h3>
<p>No link</p>
<h2>And so on...</h2>
<p>...</p>
<div><h2>This is nested</h2></div>
HTML;
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$domNodeList = $xpath->query('/html/body/h2');
$sets = array();
foreach($domNodeList as $element) {
// Save the h2
$set = array($element);
// Loop the siblings unit the next h2
while ($element = $element->nextSibling) {
if ($element->nodeName === "h2") {
break;
}
// if Node is a DOMElement
if ($element->nodeType === 1) {
$set[] = $element;
}
}
$sets[] = $set;
}
$sets 现在将包含 3 个数组,其中将包含您添加的 DOMElements。
$sets 的 var_dump 演示 https://3v4l.org/sX0Rr
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)