如何使用PHP preg_replace移除HTML文档body内的style标签及内部样式
问题原因
- 你没有接收
preg_replace的返回值:PHP的preg_replace不会修改传入的原字符串,而是会将处理后的结果作为返回值返回,你直接调用方法不赋值,原变量内容不会发生变化,这是代码不生效的核心原因。 - 正则缺少必要修饰符:默认情况下正则中的
.不会匹配换行符,如果style标签或body内容存在换行,.*?就会提前终止匹配,导致匹配失败。 - 原
style标签匹配规则不够通用:无法匹配带属性的style标签(比如<style type="text/css">),也无法兼容大写的标签写法。
修复方案
方案1:仅提取处理后的body内容
如果你只需要body的文本内容,使用以下代码:
<?php $html = '<html><head><title>Title</title><style>.button {color: #fff}</style></head><body>qwe rty zxc<style>.button {color: #fff}</style></body></html>'; // 正则加i修饰符兼容标签大小写,加s修饰符让.匹配所有字符包括换行 if (preg_match('|<body>(.*?)</body>|is', $html, $match)) { $body = $match[1]; // 接收preg_replace返回值,正则匹配所有带属性的style标签 $body = preg_replace('|<style\b[^>]*>(.*?)</style>|is', '', $body); echo $body; }
运行后输出结果为:qwe rty zxc,符合预期。
方案2:保留完整HTML结构,仅移除body内的style标签
如果你需要保留head等其他部分的内容,只清理body内的style标签,使用以下代码:
<?php $html = '<html><head><title>Title</title><style>.button {color: #fff}</style></head><body>qwe rty zxc<style>.button {color: #fff}</style></body></html>'; $processedHtml = preg_replace_callback('|<body>(.*?)</body>|is', function ($item) { $cleanBody = preg_replace('|<style\b[^>]*>(.*?)</style>|is', '', $item[1]); return "<body>{$cleanBody}</body>"; }, $html); echo $processedHtml;
运行后head内的style标签会保留,body内的style标签会被完全移除。
内容的提问来源于stack exchange,提问作者web user
相关产品推荐
相关产品推荐

