Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/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 DOMXpath查询以获取特定文本后的标记值_Php_Xpath_Domxpath - Fatal编程技术网

Php 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

我需要一个DOMXpath查询来获取特定文本后的标记值。 这是我的代码,但它不工作

$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属性,而是询问标记的值,因此这正是我的代码所做的。