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;
}
这项工作很完美。但是,我需要帮助显示这些循环中的每一个的价格,这些循环来自 div class 称为商品价格,它在 UL 之后但不是紧随其后。
我该怎么做?
使用following-sibling轴
$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";
}
我正在将外部 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;
}
这项工作很完美。但是,我需要帮助显示这些循环中的每一个的价格,这些循环来自 div class 称为商品价格,它在 UL 之后但不是紧随其后。
我该怎么做?
使用following-sibling轴
$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";
}