从特定的xpath查询中获取所有HREFS

时间:2014-01-29 10:51:54

标签: php xpath domdocument

我有一个xpath查询:

$q = $xpath->query("//p[@id='v{$versenumber}']/following-sibling::div[@class='admonition']");

其中工作正常,非常好。我使用以下内容来提取我从中收到的HTML:

$saveHTML = $dom->saveHTML($q->item(0));

但是,在此查询中,我有HREFS,我想用其他东西替换。我实际上无法识别hrefs。我想过另一个查询是相同的,但最后有/a,但是没有返回任何内容。

我原本以为我可以像这样访问它们:

$x = $q->item(0)->getElementByTagName('a');

但这似乎也不起作用:(我做错了什么?

更新

HTML我要解析:

<p id="v1"><span class="verseref">1</span></p>
<div class="notes">
<p class="first">Notes</p>
<p class="last">Paragraph</p>
</div>
<div class="admonition">
<p class="last">HTML with <a href='foobar'>inside it</a>.  I want to get all href attributes from here.</p>
</div>

使用上面的查询,我可以得到正确的文本,只是我想处理每个'href'属性,因为它们是错误的,我需要更改它们。所以我单独处理每个<div class'admonition'>,以及它们内部的所有hrefs。

然而使用:

$q = $xpath->query("//p[@id='v{$versenumber}']/following-sibling::div[@class='admonition']//a/@href");

我似乎只为一个段落获得了大量的href,只有一个。

../../ga/ch1/#v1
#v6
#v5
#v6
../../mr/ch16/#v20
../ch12/
../../heb/ch13/#v9
../ch12/
../ch3/#v1
../../lu/ch1/#v6
../../1jo/ch1/#v8
../../1jo/ch1/#v10
../../1jo/ch1/#v7
../../1jo/ch1/#v9
#v1
../../eph/ch4/#v13
../../ro/ch14/
../../ro/ch14/#v1
../ch5/
../ch6/
../ch7/
../ch8/
../ch11/
../ch12/
../ch15/
../../ro/ch14/
#v12
../ch3/#v4
../ch15/#v24
../../eph/ch5/#v17
../../ro/ch8/#v6
../../../ot/ge/ch11/#v3
../../../ot/ps/ch133/
../../../ot/jer/ch32/#v39
../../ac/ch4/#v32
../../ro/ch12/#v16
../../ro/ch15/#v5
../../php/ch1/#v27
../../php/ch2/#v1
../../1th/ch5/#v13
../../jas/ch3/#v13
../../1pe/ch3/#v8
../../eph/ch4/#v13
../ch16/#v15
../ch16/#v17
../ch16/#v24
../../ac/ch18/#v12
../ch16/#v15
../ch16/#v17
../../ac/ch11/#v18
../../mt/ch28/#v19
../../mt/ch26/#v2
../ch2/#v14
../../ro/ch1/#v16
../../ro/ch1/#v16
../../2co/ch4/#v3
#v17
../../ac/ch20/#v30
#v18
../../../ot/isa/ch29/#v14
../../../ot/isa/ch29/#v14
../../../ot/isa/ch29/#v13
../ch2/#v14
../../ro/ch10/#v10
#v21
#v26
../ch2/
#v18
#v11
../../lu/ch6/#v38
../../../ot/ps/ch14/#v1
../../../ot/ps/ch53/#v1
../../col/ch2/#v3
#v23
#v18
../../ac/ch5/#v34
../../ac/ch26/#v24
../../ga/ch2/#v1
#v26
#v25
../../ac/ch24/#v25
../../2co/ch10/#v12
../../ro/ch7/#v18
#v30
../../ro/ch7/#v18
../../joh/ch8/#v44
../../mt/ch26/#v41
../../ro/ch8/#v18
#v26
../../../ot/isa/ch42/#v8
../../joh/ch3/#v3
../../../ot/pr/ch3/#v6
../../ro/ch8/#v23
#v26

..哪一个必须是整个文件,否则我不知道从哪里得到所有这些hrefs。

2 个答案:

答案 0 :(得分:1)

following-sibling是一个轴,而不是一个选择器,它只是指定了通过DOM的导航模式。您的following-sibling::div[@class='admonition']要求所有跟随(在任何距离)所选div的“警告”pposition()函数可以帮助您解决此问题。尝试类似following-sibling::div[@class='admonition' and position()=1]的内容。

答案 1 :(得分:0)

$a_tags = $xpath->query('.//a', $q->item(0));