Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用XPath 1获取两个XPath节点之间的文本。通用解决方案,而不是特殊情况_Php_Xpath_Domxpath - Fatal编程技术网

Php 使用XPath 1获取两个XPath节点之间的文本。通用解决方案,而不是特殊情况

Php 使用XPath 1获取两个XPath节点之间的文本。通用解决方案,而不是特殊情况,php,xpath,domxpath,Php,Xpath,Domxpath,有没有办法用XPath 1获取两个节点之间的文本 示例:我们希望得到F和D之间的文本,预期结果为“G” 最后,函数: public function getNodesBetween($a, $b, $domxpath) { $query = $a."/following::text()[. = ".$b."/preceding::text()]"; $elements = $domxpath->query($query); $inside =

有没有办法用XPath 1获取两个节点之间的文本

示例:我们希望得到F和D之间的文本,预期结果为“G”

最后,函数:

public function getNodesBetween($a, $b, $domxpath) {
        $query = $a."/following::text()[. = ".$b."/preceding::text()]";
        $elements = $domxpath->query($query);
        $inside = '';
        foreach ($elements as $element) {
            $inside .= $element->nodeValue;
        }
        dd($inside);
}
如果我试着从A搜索到D,它是有效的,输出是“bcfg”。如果我在F和D之间搜索,它将返回一个空字符串。似乎它正在搜索兄弟姐妹,而F没有兄弟姐妹,所以它停止了。我能找到的唯一答案是XPath 2.0:

“假设您需要两个h3之间的所有树深度的节点 元素,不一定是兄弟”


/path/to/first/h3/following::node()[。您正在查找
$A/following::node()
$B/preference::node()的交叉点

在XPath 1.0中,$X和$Y的交集由
$X[count(.|$Y)=count($Y)]
给出

这就给了你

$A/following::node()[count(.|$B/preceding::node())=count($B/preceding::node())]

它的性能可能非常差。

您使用“between”的方式是按顺序的,这不是XML的工作方式。永远不要使用“=”来比较节点的标识:它会按内容进行比较。这是您建议的查询:
$query=$a.“/following::node()[count(.|“$b.”/previous::node())=count(.$b.“/previous::node())=count(.$b.“/previous::node())”;
但它也不起作用。返回一个空字符串。我的错误是,我做了一个错误的变量赋值。它应该是:
$a='/html/body/b/c/f';
才有意义。谢谢!
public function getNodesBetween($a, $b, $domxpath) {
        $query = $a."/following::text()[. = ".$b."/preceding::text()]";
        $elements = $domxpath->query($query);
        $inside = '';
        foreach ($elements as $element) {
            $inside .= $element->nodeValue;
        }
        dd($inside);
}
/path/to/first/h3/following::node()[. << /path/to/second/h3]
$A/following::node()[count(.|$B/preceding::node())=count($B/preceding::node())]