我有以下html:
<html>
<body>
bla bla bla bla
<div id="myDiv">
more text
<div id="anotherDiv">
And even more text
</div>
</div>
bla bla bla
</body>
</html>
我想删除从<div id="anotherDiv">
开始直到其关闭的<div>
为止的所有内容。我该怎么做?
发布于 2010-07-22 20:10:01
$dom = new DOMDocument;
$dom->loadHTML($htmlString);
$xPath = new DOMXPath($dom);
$nodes = $xPath->query('//*[@id="anotherDiv"]');
if($nodes->item(0)) {
$nodes->item(0)->parentNode->removeChild($nodes->item(0));
}
echo $dom->saveHTML();
发布于 2010-07-22 20:00:57
您可以像这样使用preg_replace()
:
$string = preg_replace('/<div id="someid"[^>]+\>/i', "", $string);
发布于 2015-07-13 18:09:35
假设您的html内容存储在变量$html中:
$html='<html>
<body>
bla bla bla bla
<div id="myDiv">
more text
<div id="anotherDiv">
And even more text
</div>
</div>
bla bla bla
</body>
</html>';
要按ID删除标记,请使用以下代码:
$dom=new DOMDocument;
$dom->validateOnParse = false;
$dom->loadHTML( $html );
// get the tag
$div = $dom->getElementById('anotherDiv');
// delete the tag
if( $div && $div->nodeType==XML_ELEMENT_NODE ){
$div->parentNode->removeChild( $div );
}
echo $dom->saveHTML();
请注意,某些版本的libxml
要求存在doctype
才能使用getElementById
方法。
在这种情况下,您可以在$html前面加上<!doctype>
$html = '<!doctype>' . $html;
或者,正如戈登的回答所建议的,您可以使用DOMXPath
通过xpath来查找元素:
$dom=new DOMDocument;
$dom->validateOnParse = false;
$dom->loadHTML( $html );
$xp=new DOMXPath( $dom );
$col = $xp->query( '//div[ @id="anotherDiv" ]' );
if( !empty( $col ) ){
foreach( $col as $node ){
$node->parentNode->removeChild( $node );
}
}
echo $dom->saveHTML();
无论标签是什么,第一种方法都可以工作。如果您想使用具有相同id但不同标记的第二种方法,例如form
,只需将//div[ @id="anotherDiv" ]
中的//div
替换为“//form
”
https://stackoverflow.com/questions/3308530
复制相似问题