我想在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()]');
哪些查询会产生预期效果?
答案 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')]