PHP-DOM-previousSibling不';行不通
根据上面的标记,请注意PHP-DOM-previousSibling不';行不通,php,html,xpath,domdocument,Php,Html,Xpath,Domdocument,根据上面的标记,请注意的直接同级实际上是一个新行字符\n 作为替代方案,您可以首先检查前面的同级,并检查它是否是标记(如果是),然后获取其->nodeValue: <?php $dom = new \domDocument; $dom->loadHTML('<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="tex
的直接同级实际上是一个新行字符\n
作为替代方案,您可以首先检查前面的同级,并检查它是否是
标记(如果是),然后获取其->nodeValue
:
<?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;
}
$nodelist=$xpath->query('//div/p/img');
foreach($k=>v的节点列表){
//$previousSibling=$
$prev=$xpath->evaluate('./前面的同级::*[1]',$v->parentNode);
如果($prev->length>0&&$prev->item(0)->标记名==='h1'){
echo$prev->item(0)->nodeValue,
;
}
}
谢谢,为了完全理解代码的含义,我阅读了大量Xpath文章,发现您的解决方案是正确的。然而,有些事情我还是不明白。1.我已尝试删除“/”,但效果良好,是否有必要?2.前面的兄弟姐妹::*[1]我将其更改为前面的兄弟姐妹::h1[1],这是否更好?3.正如我的问题所述,我不知道为什么PHP内置属性不起作用。无论如何,谢谢你的解决方案,因为它可以用另一种方式解决我的问题,但我真的想通过我最初的路径来解决它@user7031它只获取前一个元素,之后它只检查是否有一个元素,如果它是
标记,则获取文本。很高兴这个帮助编辑帮助了99%的部分!真的很好,只是想通过PHP提供的属性来解决这个问题,如果几个小时内没有人回答我的问题,我会将你的问题标记为已接受!谢谢大家!@user7031不,/
是不必要的-您可以从XPath表达式中忽略它(但是/
有时必须保留,不能用/
替换)。哦,是的,您是对的,我的第二个问题是,您的解决方案是正确的!
$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/>';
}
}