我想删除任何空的html标记,该标记为空或包含空格。
喜欢得到的东西:
$string = "<b>text</b><b><span> </span></b><p> <br/></p><b></b><font size='4'></font>";
到:
$string ="<b>text</b>=;
答案 0 :(得分:3)
以下是DOM的方法:
// init the document
$dom = new DOMDocument;
$dom->loadHTML($string);
// fetch all the wanted nodes
$xp = new DOMXPath($dom);
foreach($xp->query('//*[not(node()) or normalize-space() = ""]') as $node) {
$node->parentNode->removeChild($node);
}
// output the cleaned markup
echo $dom->saveXml(
$dom->getElementsByTagName('body')->item(0)
);
这会输出类似
的内容<body><b>text</b></body>
XML文档需要根元素,因此无法省略。你可以str_replace
。以上可以处理破碎的HTML。
如果要有选择地删除特定节点,请调整XPath查询。
另见
答案 1 :(得分:1)
function stripEmptyTags ($result)
{
$regexps = array (
'~<(\w+)\b[^\>]*>\s*</\\1>~',
'~<\w+\s*/>~'
);
do
{
$string = $result;
$result = preg_replace ($regexps, '', $string);
}
while ($result != $string);
return $result;
}
$string = "<b>text</b><b><span> </span></b><p> <br/></p><b></b><font size='4'></font>";
echo stripEmptyTags ($string);
答案 2 :(得分:0)
您需要多次运行代码,才能使用正则表达式执行此操作。
执行此操作的正则表达式是:
/<(?:(\w+)(?: [^>]*)?`> *<\/$1>)|(?:<\w+(?: [^>]*)?\/>)/g
但是例如在你的字符串上你必须至少运行两次。删除<br/>
后,第二次删除剩余的<p> </p>
。