如何用preg_replace移除HTML中空li及含空嵌套标签的li元素?
移除HTML中空及含内部空标签的 元素
你的问题在于当前正则仅能匹配直接包含空白或 的空<li>,但无法识别内部嵌套空标签(如包含仅 的<span>)的情况。下面提供两种解决方案:
方案1:改进正则表达式(适合简单场景)
针对单层嵌套的空标签场景,可以扩展正则,允许<li>内部包含任意空标签(标签内仅空白或 ):
$contenuto = preg_replace('/<li[^>]*>(?:\s*| |<[^>]*>(?:\s*| )*<\/[^>]*>)*\s*<\/li>/i', '', $contenuto);
注意:这个正则仅能处理一层嵌套的空标签,如果存在多层嵌套(如<li><span><span> </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;"> </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; // 将 (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>的全部文本内容,清理掉 和空白字符后判断是否为空 - 若为空则从DOM树中移除该
<li>元素,最后输出处理后的HTML
内容的提问来源于stack exchange,提问作者itajackass
相关产品推荐
相关产品推荐

