假设我有以下代码:
<div class="content">
<h3>Test</h3>
<img src="#" alt="" />
<p>Lorem ipsum</p>
<p>dolor sit</p>
<p><!-- pagebreak --></p>
<p>amet</p>
</div>
我想修剪我的代码并在pagebreak之后删除所有内容,但是要保持html逻辑(
</div>
):<div class="content">
<h3>Test</h3>
<img src="#" alt="" />
<p>Lorem ipsum</p>
<p>dolor sit</p>
</div>
工具:Zend,普通PHP。
有什么想法吗?
最佳答案
可以使用xpath访问这些节点,如下所示:
$doc = new DOMDocument;
$doc->loadHTML($html); // your content with a between '<html></html>' pair
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//p[contains(comment(), "pagebreak")]/following-sibling::*|//p[contains(comment(), "pagebreak")]');
foreach ($elements as $elem) {
$elem->parentNode->removeChild($elem);
}
print $doc->saveHTML();
对xpath的一点分解:
//p每个p元素。
//p[]过滤p的列表,就像它是数组一样。
//p[contains(comment(),“pagebreak”)]如果其comment()值包含“pagebreak”字符串,则筛选器为。
//p[contains(comment(),“pagebreak”)]/following sibling::*已选择p的every following sibling。
另一部分只是一个具有相同模式的并集(
|
),没有following-sibling::*
部分。编辑:
一个可能不那么毛茸茸的xpath是:
//p[包含(comment(),“pagebreak”)]/前一个同级::*[1]/后一个同级::*
这样做的诀窍是退后兄弟列表中的一个(此时目标是注释前的
<p>
),并使该节点的following-siblings::*