尝试在 class 标签与 PHP DOMXPATH 之间获取数据

try to grab data between class tag with PHP DOMXPATH

我试图在我的 html 文档中获取两个 css class 标签之间的数据。

这里是例子。

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

我不知道如何获取

class heading10 和 heading11 之间的

数据。

我试过//p[@class="heading10"]//following-sibling::p],它会抓取class标题10之后的所有<p>

试试

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

编辑:

对@jpaugh 的更多解释:

OP 的 xpath 获取 class="heading10" 元素之后的所有同级 p 元素。我已经添加了对这些元素的 position() 的限制,使其小于带有 class="heading11".

p 元素的位置

以下代码已确认适用于 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)
     )
  ]