Php 如果元素是连续的,如何从DOM中删除它们

Php 如果元素是连续的,如何从DOM中删除它们,php,html,dom,xpath,Php,Html,Dom,Xpath,我继承了下面的一段PHP代码,它在将内容推入页面之前从DOM中删除元素。我们只想显示前5个元素,以避免页面过长 假设代码检索如下结构的HTML片段: 2019 记录 记录B 2018 记录C 记录D 记录E 2017 记录F 2016 记录G 现在,下面的代码将删除所有额外记录: $dom=新的DOMDocument; //请确保加载编码 $dom->loadHTML$tmp; //让我们使用XPath $finder=newdomxpath$dom; //设限 $limit=5$cnt=0;

我继承了下面的一段PHP代码,它在将内容推入页面之前从DOM中删除元素。我们只想显示前5个元素,以避免页面过长

假设代码检索如下结构的HTML片段:

2019 记录 记录B 2018 记录C 记录D 记录E 2017 记录F 2016 记录G 现在,下面的代码将删除所有额外记录:

$dom=新的DOMDocument; //请确保加载编码 $dom->loadHTML$tmp; //让我们使用XPath $finder=newdomxpath$dom; //设限 $limit=5$cnt=0; //并移除不需要的元素 foreach$finder->query//*[contains@class,“记录”]为$elm{ 如果$cnt>=$limit $elm->parentNode->removeChild$elm; $cnt++; } //最后,回声 echo$dom->saveHTML$dom->documentElement; 从逻辑上讲,我最终拥有以下HTML:

2019 记录 记录B 2018 记录C 记录D 记录E 2017 2016 我怎样才能确定所有元素都具有类年,并且下一个同级也具有这个类并将其删除?这将得到2017元素

然后,我相信这只是检查最后一个元素是否具有班级年份并将其删除的问题


或者有更干净的方法来实现这一点吗?

您可以在当前foreach之后添加一个额外的foreach

foreach($finder->query("//div[@class='year']/following-sibling::div[1][@class='year']") 
        as $elm ) {
    $elm->parentNode->removeChild($elm);
}

这里的XPath查找一个元素,然后只查看sibling::div[1]后面的同一事物的下一个标记,将其限制为仅在当前div标记之后的下一个div标记。

这里是一个简单的JS方法,以防您希望在客户端上执行此操作

const recs=document.queryselectoral.record; const divs=document.querySelectorAlldiv; const lastRec=recs[4]; 让发现=错误; divs.forEachdiv=>{ 找到div.classList.togglehide 如果div==lastRec found=true } .hide{显示:无} 2019 记录 记录B 2018 记录C 记录D 记录E 2017 记录F 2016
记录GI最终使用以下代码:

$dom=新的DOMDocument; //请确保加载编码 $dom->loadHTML$tmp; //让我们使用XPath $finder=newdomxpath$dom; foreach$finder->query//*[contains@class,“record'][5]/以下同级::*作为$elm{ $elm->parentNode->removeChild$elm; } //最后,回声 echo$dom->saveHTML$dom->documentElement;
它允许我在不使用嵌套循环的情况下一次完成目标

不清楚这里的规则是什么。为什么记录F和G是特殊的?@mplungjan我们只想显示前5个元素的记录。否则,页面将太长。