PHP DOM previousSibling不起作用

时间:2015-05-06 11:18:44

标签: php html xpath domdocument

<?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属性似乎不起作用,它返回一个没有tagname属性的节点,其previousSibling属性为“(省略对象值)”

我的路径必须遵循img-&gt; p-&gt;之前的h1,因为并非每个p标签都有自己的h1标签。

谢谢!

1 个答案:

答案 0 :(得分:3)

根据您的上述标记,请注意<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/>';
    }
}

Sample Output