代码之家  ›  专栏  ›  技术社区  ›  lambshaanxy

使用phpQuery选择特定的文本节点

  •  2
  • lambshaanxy  · 技术社区  · 14 年前

    好吧,这让我抓狂了。我正在尝试用phpQuery筛选以下看似微不足道的HTML:

    <td><nobr>10-05-2009</nobr><br>06:10<br>17:35 -1</td>
    

    日期很容易,因为它被包裹在nobr标签里,所以,例如。 $element[':first-child']->text() 就这样。 但我该如何在第二段文字中找到我那脏兮兮的手套呢?

    CSS只在元素上工作,所以 nth-child(2),(3) 返回周围环境 <br> 标签,而不是文字。

    如果我可以将其XPath,则 .//text() 会是金子。但显然在phpquery地区 $element->xpath->query('.//text()') 是文档根目录,所以我得到整个文档中的每一段文本!

    思想?所有的解决方案 How do I select text nodes with jQuery? 似乎涉及到javascript dom操作,这比PHP糟糕的dom api要少得多。可能只是把整个元素放到字符串中然后爆炸 <BR> 是去的路…

    3 回复  |  直到 14 年前
        1
  •  3
  •   user357812    14 年前

    http://php.net/manual/en/domxpath.query.php

    多姆诺德利斯特 domxpath::查询 ( 一串 $表达式 [,domnode节点 $contextnode [,布尔值 $地区代码 = ])

    所以,这应该和 td 作为上下文节点:

    $element->xpath->query('text()[1]',$element)
    
        2
  •  0
  •   cwallenpoole    14 年前

    您是否尝试重复使用 $element[':first-child']->siblings() ?你应该可以访问他们的所有文本,不是吗?

        3
  •  0
  •   lambshaanxy    14 年前

    以亚历杭德罗的回答为基础,我想出了这个小功能:

    function nth_text($element, $n) {
      $xpath = new DOMXPath($element->ownerDocument);
      return $xpath->query('.//text()', $element)->item($n)->textContent;
    }
    

    顺便说一下,这是纯php dom,不需要phpquery(或者允许,参数必须是domnode或domelement)。现在,最初的问题很简单:

    $src_date = nth_text($element, 0);
    $src_time = nth_text($element, 1);
    

    哎呀!

    推荐文章