Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-DOM-previousSibling不';行不通_Php_Html_Xpath_Domdocument - Fatal编程技术网

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/>';
    }
}