假设我有以下代码:

<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::*

10-01 10:52