使用PHP按类名删除列表项

时间:2015-08-20 16:50:19

标签: php domdocument

当子链接有一个类'hide'时,我试图删除父列表项。如果其中的孩子有'隐藏'类,我如何获得班级名称然后删除家长'li'?

$html = '<ul> 
    <li><a href="/first">First Item</a></li>
    <li><a class="hide" href="/first">First Item</a></li>
</ul>';

$dom = new DOMDocument;
@$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('li') as $tag){
    // Check if there is a hide and remove the parent list item
    }

2 个答案:

答案 0 :(得分:1)

您可以将DOMXPathDOMDocument结合使用。请尝试以下方法:

<?php

$html = '<ul>
    <li><a href="/first">First Item</a></li>
    <li><a class="hide" href="/first">Second Item</a></li>
</ul>';

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$elements = $xpath->query('//a[@class="hide"]/..');

foreach ($elements as $el) {
    $el->parentNode->removeChild($el);
}

echo $doc->saveHTML();

收率:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">

<html>
    <body>
        <ul>
            <li><a href="/first">First Item</a></li>
        </ul>
    </body>
</html>

XPath表达式//a[@class="hide"]/..将匹配包含“hide”类的任何<a>标记,/..将返回其父级。所以你要返回任何匹配的父节点;即:在您的示例中,任何匹配的父<li>

最后,我们迭代所有匹配的<li>元素,并从其父节点中删除每个元素。

以下是有关DOMXPath::query()

的更多信息

希望这会有所帮助:)

答案 1 :(得分:1)

据我所知,你需要根据内部元素的类名删除ul中的第一个li;这是一个解决方案

  $html = '<ul> 
        <li><a href="/first">First Item</a></li>
        <li><a class="hide" href="/first">First Item</a></li>
    </ul>';

    $doc = new DOMDocument;
    @$doc->loadHTML($html);
    $xpath = new DOMXpath($doc);

    $elements = $xpath->query("//ul/li/a[@class='hide']/parent::*/preceding-sibling::*[1]");


    foreach($elements as $node) {
      $node->parentNode->removeChild($node);
    };
    echo $doc->saveHTML();