我有以下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>
。我怎么做?
使用原生 DOM
$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();
你可以preg_replace()
像这样使用:
$string = preg_replace('/<div id="someid"[^>]+\>/i', "", $string);
使用本机XML 操作库
假设您的 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
存在 a 才能使用该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
in替换//div[ @id="anotherDiv" ]
为 ' //form
'
strip_tags() 函数是您正在寻找的。
我写这些是为了去除特定的标签和属性。由于它们是正则表达式,因此不能 100% 保证在所有情况下都能正常工作,但对我来说这是一个公平的权衡:
// Strips only the given tags in the given HTML string.
function strip_tags_blacklist($html, $tags) {
foreach ($tags as $tag) {
$regex = '#<\s*' . $tag . '[^>]*>.*?<\s*/\s*'. $tag . '>#msi';
$html = preg_replace($regex, '', $html);
}
return $html;
}
// Strips the given attributes found in the given HTML string.
function strip_attributes($html, $atts) {
foreach ($atts as $att) {
$regex = '#\b' . $att . '\b(\s*=\s*[\'"][^\'"]*[\'"])?(?=[^<]*>)#msi';
$html = preg_replace($regex, '', $html);
}
return $html;
}
这个怎么样?
// Strips only the given tags in the given HTML string.
function strip_tags_blacklist($html, $tags) {
$html = preg_replace('/<'. $tags .'\b[^>]*>(.*?)<\/'. $tags .'>/is', "", $html);
return $html;
}
在使用 RafaSashi 的回答之后preg_replace()
,这里有一个适用于单个标签或标签数组的版本:
/**
* @param $str string
* @param $tags string | array
* @return string
*/
function strip_specific_tags ($str, $tags) {
if (!is_array($tags)) { $tags = array($tags); }
foreach ($tags as $tag) {
$_str = preg_replace('/<\/' . $tag . '>/i', '', $str);
if ($_str != $str) {
$str = preg_replace('/<' . $tag . '[^>]*>/i', '', $_str);
}
}
return $str;
}