webklex/laravel-imap 1.6 提取邮件纯文本正文CSS残留问题求助
问题解决方法:过滤laravel-imap提取邮件正文时残留的CSS代码
核心问题:strip_tags()函数仅会移除HTML标签本身,不会删除<style>、<script>等标签包裹的内部内容,所以CSS、JS代码会直接留在处理后的文本中。原有用于匹配CSS的正则范围极有限,只能匹配单行的body { ... }规则,无法覆盖其他选择器的CSS,也无法处理跨行的样式规则,因此完全起不到过滤残留CSS的作用。
方案1:正则快速修复(适配绝大多数场景)
直接先完整移除<style>、<script>标签及内部所有内容,再做后续处理即可,修改后的代码如下:
public function format_html_body($str) { $str = htmlentities($str, ENT_COMPAT, "UTF-8"); $str = str_replace(chr(10), "<br>", $str); return $str; } // 在另一个函数中 $body = $oMessage->getHTMLBody(); // 新增:移除所有style标签及内部CSS内容,i不区分大小写,s让.匹配换行符 $body = preg_replace('#<style\b[^>]*>(.*?)</style>#is', '', $body); // 新增:移除所有script标签及内部JS内容,避免JS代码残留 $body = preg_replace('#<script\b[^>]*>(.*?)</script>#is', '', $body); $stripped_body = strip_tags($body); // 优化:仅替换多段空白为单个空格,无需额外匹配CSS $formatted_body = preg_replace('/\s+/', ' ', $stripped_body); $final_Content = self::format_html_body($formatted_body); echo $final_Content;
方案2:DOMDocument解析(更稳定,兼容不规范HTML)
如果遇到格式非常混乱的垃圾邮件,正则可能出现漏匹配,用PHP内置的DOM解析器处理会更稳妥:
public function format_html_body($str) { $str = htmlentities($str, ENT_COMPAT, "UTF-8"); $str = str_replace(chr(10), "<br>", $str); return $str; } // 在另一个函数中 $body = $oMessage->getHTMLBody(); $dom = new DOMDocument(); // 禁用HTML5解析报错,适配不规范的邮件HTML libxml_use_internal_errors(true); $dom->loadHTML('<?xml encoding="UTF-8">' . $body); libxml_clear_errors(); // 移除所有style节点 $styleNodes = $dom->getElementsByTagName('style'); while ($styleNodes->length > 0) { $styleNodes->item(0)->parentNode->removeChild($styleNodes->item(0)); } // 移除所有script节点 $scriptNodes = $dom->getElementsByTagName('script'); while ($scriptNodes->length > 0) { $scriptNodes->item(0)->parentNode->removeChild($scriptNodes->item(0)); } // 提取纯文本内容 $stripped_body = trim($dom->textContent); $formatted_body = preg_replace('/\s+/', ' ', $stripped_body); $final_Content = self::format_html_body($formatted_body); echo $final_Content;
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

