XPath:得到最接近的标题元素(h1,h2,h3等)

时间:2015-06-11 08:37:42

标签: php xpath

我想在PHP中使用XPath选择最接近表单的标题元素(无论是h1,h2,h3,h4,h5还是h6)。

<h2>Foo</h2>
<h3>Bar</h3>
<form>
    <input />
</form>

上面的示例应返回h3(Bar),因为它最接近表单。

<h4>Kee</h4>
<form>
    <input />
</form>

另一方面,这个例子应该返回h4(Kee),因为它最接近。

此查询(来自https://stackoverflow.com/a/2216795/4391251)仅适用于h2标记。我可以修改它为h1,h3,h4,h5等,但我想要一个包罗万象的查询。

$headings = $xpath->query('((//form)[2]/ancestor::*/h2[.!=""])[last()]');

基本上我想要这样的东西

$headings = $xpath->query('((//form)['.$i.']/ancestor::*/[h2 or h3][.!=""])[last()]');

除此之外不会返回任何结果,也不会(基于https://stackoverflow.com/a/7995095/4391251

$headings = $xpath->query('((//form)['.$i.']/ancestor::*/[self::h2 or self::h3][.!=""])[last()]');

哪些查询会产生预期效果?

3 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

$xpath->query('//form['.$i.']/preceding-sibling::*[self::h2 or self::h3][1]')

基本上,xpath获得form[i]类型<h2><h3>的第一个前一个兄弟(或者其他,只需列出xpath谓词中所需的所有其他元素)。

答案 1 :(得分:1)

在表格之前先拿着拳头

//form/preceding::*[starts-with(name(),'h')][1]

答案 2 :(得分:-1)

/html/body/*[starts-with(name(),'h')]