【问题标题】:Reg expression to remove empty Tags (any of them)?正则表达式删除空标签(其中任何一个)?
【发布时间】:2013-02-08 22:28:30
【问题描述】:

我喜欢删除 any 空的或包含空格的空 html 标记。

想要得到的东西:

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

到:

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

【问题讨论】:

  • &lt;img&gt; 标签或其他有意义的标签呢? line1&lt;br&gt;line2 呢?空的&lt;td&gt; 标签呢?你能更好地描述你的目的吗?试着解释你想要做什么,而不是你认为应该怎么做。
  • 一般来说,用正则表达式解析 html 是个坏主意。改用 xml 解析器
  • 另外,我认为应该是$string = "&lt;b&gt;text&lt;/b&gt;";,但这可能只是一个错字。

标签: php regex


【解决方案1】:

这是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 查询。

另见

【讨论】:

    【解决方案2】:
    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);
    

    【讨论】:

    • 这项工作。还有 1 个问题:1)我如何告诉函数应该删除哪些标签,假设我只需要删除:p、a 和 span 标签。
    • 经过深思熟虑,我真的认为您应该使用 DOM 方法,因为它更可靠。
    • 我将您的部分函数更改为:(但现在根本不起作用)$regexps = array ('~]*> \s*\\1>~', '~

      ~' );
    • 与现实性相关:在我的情况下,我将仅将您的函数用于 html 文档的某些部分中的文本,但我不会将它用于整个 html 文档。那么我认为这不会是市长的问题。你怎么看?
    • 标签枚举版本的问题是你永远不知道这些标签会是什么。第一个正则表达式有 '~]*>\s*\\1>~'。
    【解决方案3】:

    您需要多次运行代码才能仅使用正则表达式执行此操作。

    执行此操作的正则表达式是:

    /<(?:(\w+)(?: [^>]*)?`> *<\/$1>)|(?:<\w+(?: [^>]*)?\/>)/g
    

    但是,例如在您的字符串上,您必须至少运行两次。一旦它将删除&lt;br/&gt;,第二次将删除剩余的&lt;p&gt; &lt;/p&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2011-04-16
      • 2013-01-07
      • 1970-01-01
      相关资源
      最近更新 更多