簡體   English   中英

DOMXpath查詢以獲取特定文本后的標簽值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM