DomXPath:在DomXPath查询结果中搜索吗? - php

如何查询xpath结果的子元素,而无需再次查询整个文档?

我查询我的文档以找到类为<li>的最后一个menu-item

$doc = new DomDocument();
@$doc->loadHTML( $html );
// $html is invalid (and should be at this point),
// so use @ sign to suppress errors
$xpath = new DomXPath( $doc );
$li = $xpath->query( "(//li[contains(concat(' ', normalize-space(@class), ' '), 'menu-item')])[last()]" )->item( 0 );

上面的工作很好,现在我要查询$li来找到以下内容:

$p = $xpath->query( "//p[contains(concat(' ', normalize-space(@class), ' '), 'field-description')]" )->item( 0 );

类别为pfield-description标记。这不起作用并返回找到的第一个实例,如果我对其进行修改并使用[last()](无论这是什么),那么它会起作用,但不一定是此处的最佳解决方案:

$p = $xpath->query( "(//p[contains(concat(' ', normalize-space(@class), ' '), 'field-description')])[last()]" )->item( 0 );

上面的行有效,但是我想在$li中而不是整个文档中再次查询。

参考方案

从The second argument到query的是contextnode,它将搜索限制在该节点内。但是,如果使用绝对xpath,query仍将返回整个文档的节点。

php > $dd = new DomDocument();
php > // deliberately using malformed html.
php > $dd->loadhtml('<html><head><title>wat</title></head><body><div>Hello, <p>world</p></div><div class="container"><p>I like pie</div></body></html>');
php > $xp = new DomXPath($dd); 
php > $container = $xp->query('//div[@class="container"]')->item(0);
php > var_dump($xp->query('//p'));
class DOMNodeList#6 (1) {
  public $length =>
  int(2)
}
php > var_dump($xp->query('//p', $container));
class DOMNodeList#4 (1) {
  public $length =>
  int(2)
}
php > var_dump($xp->query('p', $container));
class DOMNodeList#5 (1) {
  public $length =>
  int(1)
}

您可以使用类似.//x的模式来在上下文节点中递归匹配所有x元素。 (HT:Alf Eaton)

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

PHP-嵌套的foreach循环中的异常行为 - php

一些背景我有2个数组,其中包含以下信息:$x = [ ['name' => 'Fred', 'ykey' => 'A', 'rank' => '1', 'VIP' => '1'…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…