求PHP preg_replace正则:删除td标签内style的width与height属性
移除td标签内inline style中的width和height样式属性
解决方案代码
// 示例HTML内容 $html = '<td style="vertical-align: top; min-width: 30px; padding-right: 10px; height: 12px; width: 15px;" valign="top"></td>'; // 正则匹配模式 $pattern = '/(<td[^>]*style=")([^"]*?)(width:\s*[^;"]+;?\s*|height:\s*[^;"]+;?\s*)+([^"]*")/i'; $replacement = '$1$2$4'; // 循环替换彻底清除所有width/height样式 while (preg_match($pattern, $html)) { $html = preg_replace($pattern, $replacement, $html); } // 输出处理后的结果(用htmlspecialchars转义方便查看) echo htmlspecialchars($html);
代码说明
正则逻辑拆解
<td[^>]*style=":精准定位td标签内的style属性起始部分,捕获为第1组,确保只作用于td标签([^"]*?):捕获style属性中width/height样式之前的所有合法内容,作为第2组(width:\s*[^;"]+;?\s*|height:\s*[^;"]+;?\s*)+:匹配任意形式的width或height样式,包括:- 大小写不敏感(比如
Width/HEIGHT) - 属性值前后的空格(比如
width : 15px) - 结尾带或不带分号(比如
width:15px或width:15px;)
- 大小写不敏感(比如
([^"]*"):捕获width/height样式之后到style属性结束引号前的内容,作为第4组
循环替换的必要性
单次正则替换可能无法覆盖分散在style中的多个width/height样式,通过循环直到没有匹配项,确保彻底清除所有目标样式。效果验证
处理后示例HTML会变为:<td style="vertical-align: top; min-width: 30px; padding-right: 10px;" valign="top"></td>同时不会影响其他标签(如
<div style="width:100px;"></div>中的width样式会被保留)
内容的提问来源于stack exchange,提问作者user451513
相关产品推荐
相关产品推荐

