Php DOMXpath查询以获取特定文本后的标记值
我需要一个DOMXpath查询来获取特定文本后的标记值。 这是我的代码,但它不工作Php DOMXpath查询以获取特定文本后的标记值,php,xpath,domxpath,Php,Xpath,Domxpath,我需要一个DOMXpath查询来获取特定文本后的标记值。 这是我的代码,但它不工作 $str= '............... URL: <a href="http://www.example.com" target="_blank">http://example.com#showtext</a> .................... '; $dom = new DOMDocument; @$dom->loadHTM
$str= '...............
URL: <a href="http://www.example.com" target="_blank">http://example.com#showtext</a>
....................
';
$dom = new DOMDocument;
@$dom->loadHTML($str);
$xp = new DOMXPath($dom);
$links = $xp->query('//[text()="URL: "]following-sibling::a[1]');
foreach ($links as $link) {
echo $link->nodeValue . PHP_EOL;
}
?>
我应该在查询中使用以下同级还是应该使用的同级?您正在查找文本节点后面的标记,因此基本上xpath查询必须如下所示:
//text()/following-sibling::node()
然后添加条件:
//text()[contains(., "URL: ")]/following-sibling::node()[1][name(.)="a"]
文本节点的条件仅检查它是否包含URL:但可以更明确。如果希望文本节点正好是URL:write[.=URL:]作为条件
如果希望文本节点以URL:结尾,则更为困难,因为xpath没有ends with函数。所以您必须用PHP编写它,并且自己编写。例如:
function ends_with($node, $needle){
return substr($node[0]->nodeValue, -strlen($needle)) === $needle;
}
$xp->registerNamespace("php", "http://php.net/xpath");
$xp->registerPHPFunctions("ends_with");
$links = $xp->query('//text()[php:function("ends_with", ., "URL: ")]/following-sibling::node()[1][name(.)="a"]');
关于xpath查询第二部分的条件:
following sibling::不仅针对第一个节点,而且针对之后的所有节点。因此,编写以下同级::a[1]将返回文本后的第一个节点,而不保证该节点立即跟随文本
要确保后面的第一个节点是a标记,您需要将后面的第一个节点作为目标,并检查它是否是带有以下条件的a标记:
以下同级节点::节点[1][name.=a]也尝试了$links=$xp->query'//[text=URL://a';但它不太管用…谢谢。但我需要你的价值。。。这段代码非常有用//text[contains.,URL://following sibling::node[1][name.=a],但它会在我需要时返回。@pco:我想知道您没有花时间阅读xpath教程或DOMDocument教程5分钟来解决您的问题。顺便说一句,您从未在问题中询问href属性,而是询问标记的值,因此这正是我的代码所做的。