gpt4 book ai didi

php - 在有效的 PHP query() XPath 中转换 Javascript XPath |标准化 JS XPath --> PHP

转载 作者:IT王子 更新时间:2023-10-29 00:04:00 26 4
gpt4 key购买 nike

这是 Javascript 中的有效 XPath:

id("priceInfo")/div[@class="standardProdPricingGroup"]/span[1]

这变成了与 DOMXPath 一起使用的有效 PHP XPath->query() 是

//*[@id="priceInfo"]//div[@class="standardProdPricingGroup"]//span[1]
  1. 您是否知道任何库或自定义组件已经进行了这种转换?
  2. 您是否知道列出这两种语法差异的可用文档?

我主要担心的是可能存在很多差异,我希望找出这些差异,但我在确定这些差异时遇到了问题。

这个问题也可以用不同的方式提出:由于 Javascript 可以有不同的有效 XPath 格式,如何将它们规范化以与 PHP 一起工作。

其中一项更新还提到,如果存在包含此定义的有效 DTD,则 id() 函数是有效的 XPath。我对输入 DTD 无能为力,如果有一种方法可以找到无需任何特定 DTD 即可工作的解决方案,那就太棒了。

更新:

我想用算法将第一种格式转换为第二种格式。我的输入是第一个而不是第二个。无法更改。

正如@Nison Maël 所指出的,第二种格式是有效的 Javascript XPath,如下所示:http://jsbin.com/elatum/2/edit不幸的是,这只会增加 Javascript XPath“碎片化”的问题。

@salathe 指出,如果记录的输入具有有效的 DTD,则有效的 Javascript XPath 查询在 PHP 中运行良好(@Dimitre Novatchev 在评论中提到了这一点,但忽略了重要性)。不幸的是,我无法控制输入 DTD,所以现在我必须研究一种方法来克服这个问题,或者找到一种即使没有有效 DTD 也能工作的解决方案。

最佳答案

刚刚看到 Salathe 实际上回答了同样的问题,但考虑到您的评论并更加强调这一点:

您不需要指定任何 DTD。只要您使用 DOMDocument::loadHTMLDOMDocument::loadHTMLFile 函数,HTML id 属性实际上是为 xpath id() 函数。使用 http://jsbin.com/elatum/2/edit 中给出的演示 HTML ,甚至在加载文档时也会出现错误:

Warning: DOMDocument::loadHTMLFile(): ID priceInfo already defined in ...

这已经表明这是一个真正的 ID 属性,因为它提示重复。相关示例代码如下所示:

$xpath = 'id("priceInfo")/div[@class="standardProdPricingGroup"]/span[1]';

$doc = new DOMDocument();
$doc->loadHTMLFile(__DIR__ . '/../data/file-11796340.html');
$xp = new DOMXPath($doc);

$r = $xp->query($xpath);
echo $xpath, "\n";
echo $r ? $r->length : 0, ' elements found', "\n";
if (!$r) return;
foreach($r as $node) {
echo " - ", $node->nodeValue, "\n";
}

输出是:

id("priceInfo")/div[@class="standardProdPricingGroup"]/span[1]
1 elements found
- hello

如果您需要更多控制,请先运行 xpath 以将所有 HTML id 属性标记为 xpath 的 ID:

$r = $xp->query("//*[@id]");
if ($r) foreach($r as $node) {
$node->setIdAttribute('id', true);
}

然后您可以使用与 id() 函数相同的 xpath,无需更改它。

关于php - 在有效的 PHP query() XPath 中转换 Javascript XPath |标准化 JS XPath --> PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11796340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com