Reg表达式删除空标签(其中任何一个)?

时间:2011-01-18 08:02:59

标签: php regex

我想删除任何空的html标记,该标记为空或包含空格。

喜欢得到的东西:

$string = "<b>text</b><b><span> </span></b><p>  <br/></p><b></b><font size='4'></font>";

到:

$string ="<b>text</b>=;

3 个答案:

答案 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>