簡體   English   中英

PHP DOMXPath 循環搜索並找到子 div 值

[英]PHP DOMXPath loop through search and find child div value

我正在將外部 HTML 內容加載到這樣的變量中:

$content = file_get_contents('http://localhost');

該頁面有一組<ul>循環,如下所示:

<ul class="items-list">
<li>Title1</li>
<li>Description1</li>
<li>Location1</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£10</div>
<a/>

<ul class="items-list">
<li>Title2</li>
<li>Description2</li>
<li>Location2</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£15</div>
</a>

<ul class="items-list">
<li>Title3</li>
<li>Description3</li>
<li>Location3</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£20</div>
</a>

<ul class="items-list">
<li>Title4</li>
<li>Description4</li>
<li>Location4</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£25</div>
</a>

我有以下代碼使用 DOMXPath 搜索所有項目列表 UL,然后我可以遍歷它並回顯它。

$dom = new DomDocument();
$dom->loadHTML($content);
$xpath = new DOMXPath($dom); 
$items = $xpath->query("//ul[@class='items-list']"); 

foreach ($items as $node) { 
  echo $node->textContent;
}

這部作品完美。 但是,我需要幫助顯示這些循環中的每一個的價格,這些循環來自名為 item-price 的 div 類,它在 UL 之后但不是緊隨其后。

我該怎么做?

使用以下兄弟軸

$xpath->query("//ul[@class='items-list']/following-sibling::div[@class='item-price']"); 

將原始查詢與following-sibling操作符結合使用可能就足夠了。

define('BR','<br />');

$strhtml='<ul class="items-list">
    <li>Title1</li>
    <li>Description1</li>
    <li>Location1</li>
    </ul>
    <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
    <div class="item-price">£10</div>

    <ul class="items-list">
    <li>Title2</li>
    <li>Description2</li>
    <li>Location2</li>
    </ul>
    <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
    <div class="item-price">£15</div>

    <ul class="items-list">
    <li>Title3</li>
    <li>Description3</li>
    <li>Location3</li>
    </ul>
    <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
    <div class="item-price">£20</div>

    <ul class="items-list">
    <li>Title4</li>
    <li>Description4</li>
    <li>Location4</li>
    </ul>
    <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
    <div class="item-price">£25</div>';


    $dom = new DomDocument();
    $dom->loadHTML( $strhtml );
    $xpath = new DOMXPath( $dom ); 
    $items = $xpath->query("//ul[@class='items-list'] | //ul[@class='items-list']/following-sibling::div[@class='item-price']"); 
    if( $items && $items->length > 0 ){
        foreach ( $items as $node ) { 
            echo $node->textContent . BR;
        }
    }

以上輸出

Title1 Description1 Location1 
£10
Title2 Description2 Location2 
£15
Title3 Description3 Location3 
£20
Title4 Description4 Location4 
£25

鑒於對 html 內容的更改,需要對 XPath 查詢稍作修改,因為包含價格的 div 不再是直接的兄弟——盡管它可能是。

$items = $xpath->query("//ul[@class='items-list'] | //ul[@class='items-list']/following::div[@class='item-price']");
foreach ($items as $node) { 
  echo $node->textContent;
  $div = $xpath->query('.//following::div[@class="item-price"][1]', $node); 
  echo $div[0]->nodeValue ."\n\n";
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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