You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用preg_replace移除HTML中空li及含空嵌套标签的li元素?

移除HTML中空
  • 及含内部空标签的
  • 元素
  • 你的问题在于当前正则仅能匹配直接包含空白或&nbsp;的空<li>,但无法识别内部嵌套空标签(如包含仅&nbsp;的<span>)的情况。下面提供两种解决方案:

    方案1:改进正则表达式(适合简单场景)

    针对单层嵌套的空标签场景,可以扩展正则,允许<li>内部包含任意空标签(标签内仅空白或&nbsp;):

    $contenuto = preg_replace('/<li[^>]*>(?:\s*|&nbsp;|<[^>]*>(?:\s*|&nbsp;)*<\/[^>]*>)*\s*<\/li>/i', '', $contenuto);
    

    注意:这个正则仅能处理一层嵌套的空标签,如果存在多层嵌套(如<li><span><span>&nbsp;</span></span></li>),则无法匹配——正则处理HTML嵌套结构天生存在局限。

    方案2:使用DOMDocument处理(推荐,支持任意嵌套)

    HTML是结构化文档,用DOM解析是更可靠的方式,能正确处理所有嵌套层级的空标签:

    $contenuto = '<ol style="margin-top: 0cm; margin-bottom: 0cm;">
    <li style="margin: 0cm 0cm 0cm 47.6px; text-align: justify; line-height: normal; font-size: 11pt; font-family: Calibri, sans-serif; text-indent: 0.4px;"><span style="font-size: 10.0pt;">x</span></li>
    <li style="margin: 0cm 0cm 0cm 47.6px; text-align: justify; line-height: normal; font-size: 11pt; font-family: Calibri, sans-serif; text-indent: 0.4px;"><span style="font-size: 10.0pt;">y</span></li>
    <li style="margin: 0cm 0cm 0cm 47.6px; text-align: justify; line-height: normal; font-size: 11pt; font-family: Calibri, sans-serif; text-indent: 0.4px;"><span style="font-size: 10.0pt;">z</span></li>
    <li style="margin: 0cm 0cm 0cm 47.6px; text-align: justify; line-height: normal; font-size: 11pt; font-family: Calibri, sans-serif; text-indent: 0.4px;"></li>
    <li style="margin: 0cm 0cm 0cm 47.6px; text-align: justify; line-height: normal; font-size: 11pt; font-family: Calibri, sans-serif; text-indent: 0.4px;"><span style="font-size: 10.0pt; color: red;">&nbsp;</span></li>
    </ol>';
    
    $dom = new DOMDocument();
    // 禁用libxml错误提示,避免解析HTML时的警告
    libxml_use_internal_errors(true);
    // 加载HTML,去掉自动添加的<html>/<body>标签
    $dom->loadHTML($contenuto, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    libxml_clear_errors();
    
    $xpath = new DOMXPath($dom);
    // 选取所有<li>元素
    $lis = $xpath->query('//li');
    
    foreach ($lis as $li) {
        // 获取<li>的所有文本内容(包括子标签的文本)
        $textContent = $li->textContent;
        // 将&nbsp;(UTF-8编码为\xc2\xa0)替换为空格,再去除首尾空白
        $cleanText = trim(str_replace("\xc2\xa0", ' ', $textContent));
        // 如果清理后文本为空,移除该<li>
        if (empty($cleanText)) {
            $li->parentNode->removeChild($li);
        }
    }
    
    // 输出处理后的HTML
    $contenuto = $dom->saveHTML();
    echo $contenuto;
    

    原理说明:

    • 通过DOMDocument解析HTML结构,确保正确识别所有嵌套标签
    • 提取每个<li>的全部文本内容,清理掉&nbsp;和空白字符后判断是否为空
    • 若为空则从DOM树中移除该<li>元素,最后输出处理后的HTML

    内容的提问来源于stack exchange,提问作者itajackass

    相关产品推荐
    方舟 Agent Plan

    超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

    最近更新时间:2026.06.19 20:14:51