PHP DOM previousSibling 不起作用

标签 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 属性似乎不起作用,它返回一个没有标签名属性的节点,它的 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/>';
    }
}

Sample Output

关于PHP DOM previousSibling 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30075201/

相关文章:

javascript - 我想停止预加载器。当页面加载时,我希望它应该隐藏

php - 如何从 View 模块获取 $_POST 请求?

xml - 使用 HTML::TreeBuilder::XPath 模块访问父级或同级的 Xpath 表达式

php - 在表格行鼠标悬停时显示提交按钮

php - 像读取数组一样读取 Twig 中的持久集合

php - 更改 PHP 行的第一个和最后一个值

html - 字段集宽度问题

php - 使用 prepare 命令更新我的表,将值增加 2

python - 在 Selenium,python 中使用 XPath 时出错

css - Xpath 或 Css 表达式将匹配或不匹配类或 ID 名称?