使用 PHP 按 class 名称删除列表项
Remove list item by class name using PHP
当 child link 有 class 'hide' 时,我试图删除 parent 列表项。如果其中的 child 具有 'hide' class,我将如何获取 class 名称然后删除 parent '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
}
您可以将 DOMXPath
与 DOMDocument
结合使用。请尝试以下操作:
<?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" class 和 /..
returns 其父项的任何 <a>
标记。所以你要返回任何匹配的父节点;即:在您的示例中,任何匹配项的父项 <li>
。
最后,我们迭代所有匹配的 <li>
元素并从其父节点中删除每个元素。
这里有更多关于 DOMXPath::query()
的信息
希望对您有所帮助:)
据我了解,您需要根据内部 a 元素的 class 名称从 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();
当 child link 有 class 'hide' 时,我试图删除 parent 列表项。如果其中的 child 具有 'hide' class,我将如何获取 class 名称然后删除 parent '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
}
您可以将 DOMXPath
与 DOMDocument
结合使用。请尝试以下操作:
<?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" class 和 /..
returns 其父项的任何 <a>
标记。所以你要返回任何匹配的父节点;即:在您的示例中,任何匹配项的父项 <li>
。
最后,我们迭代所有匹配的 <li>
元素并从其父节点中删除每个元素。
这里有更多关于 DOMXPath::query()
希望对您有所帮助:)
据我了解,您需要根据内部 a 元素的 class 名称从 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();