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

时间:2010-11-09 11:55:29

标签: jquery css-selectors xpath textnode phpquery

好的,这让我疯了。我正试图用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-land中,$element->xpath->query('.//text()')的上下文是文档根,所以我在整个文档中得到每一段文本!

想法? How do I select text nodes with jQuery?中的所有解决方案似乎都涉及Javascript DOM操作,这些操作远比PHP糟糕的DOM API差。也许只是将整个元素转储到字符串并在<br>上展开它是可行的方法......

3 个答案:

答案 0 :(得分:3)

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

  

DOMNodeList DOMXPath :: query (   string $ expression [,DOMNode    $ contextnode [,boolean $ registerNodeNS = true ]])

因此,这应该与td一起用作上下文节点:

$element->xpath->query('text()[1]',$element)

答案 1 :(得分:0)

您是否尝试过迭代$element[':first-child']->siblings()的文本方法?这应该可以让你访问他们的所有文本,不是吗?

答案 2 :(得分:0)

以Alejandro的答案为基础,我提出了这个小功能:

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);

耶!