[英]DOMXpath query to get the value of a tag after a specific text
我需要一個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: "
寫[.="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::
不僅針對第一個節點,而且針對之后的所有節點。 因此,編寫after following-sibling::a[1]
返回文本后的第一個“ a”節點,而不能保證該節點緊隨文本之后。
為確保之后的第一個節點是“ a”標簽,您需要定位之后的第一個節點並檢查其是否為帶有條件的“ a”標簽:
following-sibling::node()[1][name(.)="a"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.