尝试使用PHP DOMXPATH在类标记之间获取数据

时间:2015-11-18 21:34:02

标签: php dom domxpath

我正在尝试在我的html doc中获取两个css类标记之间的数据。

这里的例子。

<p class="heading10">text text</p>
<p>text text text</p>
<p>text text text</p>
<p class="heading11">text text</p>
<p></p>
<p></p>

我不知道如何在

类heading10和heading11之间获取

数据。

我尝试了//p[@class="heading10"]//following-sibling::p],它会在课程标题10之后获取所有<p>

1 个答案:

答案 0 :(得分:1)

尝试类似

的内容
//p[@class="heading10"]/following-sibling::p[position()<count(//p[@class="heading11"]/preceding-sibling::p)]

编辑:

对@jpaugh的更多解释:

OP的xpath在p之后抓取所有同级class="heading10"元素。我已将这些元素的position()限制小于p元素与class="heading11"的位置。

以下代码确认使用的是PHP 5.5,并且无法使用php 5.4(感谢@slphp):

$t = '<?xml version="1.0"?>
<root><p class="heading10">text text</p>
<p>text text text</p>
<p>text text text</p>
<p class="heading11">text text</p>
<p></p>
<p></p></root>';

$d = DOMDocument::LoadXML($t);
$x = new DOMXpath($d);
var_dump($x->query('//p[@class="heading10"]/following-sibling::p[position()<count(//p[@class="heading11"]/preceding-sibling::p)]'));


class DOMNodeList#6 (1) {
  public $length =>
  int(2)
}

请注意,如果<p class="heading10">不是第一个p元素,那么您可能需要减去它们:

//p[@class="heading10"]/following-sibling::p[position()<(count(//p[@class="heading11"]/preceding-sibling::p) - count(//p[@class="heading10"]/preceding-sibling::p))]

为了便于阅读,按行拆分:

//p[@class="heading10"]
 /following-sibling::p[
     position()<(
         count(//p[@class="heading11"]/preceding-sibling::p) -
         count(//p[@class="heading10"]/preceding-sibling::p)
     )
  ]