PHP DOM previousSibling 不起作用
PHP DOM previousSibling doesn't work
<?php
$dom = new \domDocument;
$dom->loadHTML('<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div>
<h1>Title1</h1>
<p><img src="" /></p>
<h1>Title2</h1>
<p><img src="" /></p>
<h1>Title3</h1>
<p><img src="" /></p>
<h1>Title4</h1>
<p><img src="" /></p>
<p><img src="" /></p>
</div>
</body>
</html>');
$xpath = new \DOMXPath($dom);
$nodelist = $xpath->query('//div/p/img');
foreach($nodelist as $k=>$v){
$title1 = $v->parentNode->previousSibling->textContent;
}
我想检索 h1 标签内的所有文本,但是 previousSibling 属性似乎不起作用,它 returns 一个没有标签名属性的节点,它的 previousSibling 属性是“(省略对象值)”
我的路径必须遵循 img->p->previous h1 ,因为在我的例子中并不是每个 p 标签都有自己的 h1 标签。
谢谢!
根据您上面的标记,请注意 <p>
的直接兄弟实际上是换行符 \n
。
作为替代方案,您可以先检查前面的同级并检查它是否是 <h1>
标记,如果是,则获取它的 ->nodeValue
:
$nodelist = $xpath->query('//div/p/img');
foreach($nodelist as $k=>$v) {
// $previousSibling = $
$prev = $xpath->evaluate('./preceding-sibling::*[1]', $v->parentNode);
if($prev->length > 0 && $prev->item(0)->tagName === 'h1') {
echo $prev->item(0)->nodeValue, '<br/>';
}
}
<?php
$dom = new \domDocument;
$dom->loadHTML('<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div>
<h1>Title1</h1>
<p><img src="" /></p>
<h1>Title2</h1>
<p><img src="" /></p>
<h1>Title3</h1>
<p><img src="" /></p>
<h1>Title4</h1>
<p><img src="" /></p>
<p><img src="" /></p>
</div>
</body>
</html>');
$xpath = new \DOMXPath($dom);
$nodelist = $xpath->query('//div/p/img');
foreach($nodelist as $k=>$v){
$title1 = $v->parentNode->previousSibling->textContent;
}
我想检索 h1 标签内的所有文本,但是 previousSibling 属性似乎不起作用,它 returns 一个没有标签名属性的节点,它的 previousSibling 属性是“(省略对象值)”
我的路径必须遵循 img->p->previous h1 ,因为在我的例子中并不是每个 p 标签都有自己的 h1 标签。
谢谢!
根据您上面的标记,请注意 <p>
的直接兄弟实际上是换行符 \n
。
作为替代方案,您可以先检查前面的同级并检查它是否是 <h1>
标记,如果是,则获取它的 ->nodeValue
:
$nodelist = $xpath->query('//div/p/img');
foreach($nodelist as $k=>$v) {
// $previousSibling = $
$prev = $xpath->evaluate('./preceding-sibling::*[1]', $v->parentNode);
if($prev->length > 0 && $prev->item(0)->tagName === 'h1') {
echo $prev->item(0)->nodeValue, '<br/>';
}
}