You need to enable JavaScript to run this app. webklex/laravel-imap 1.6 提取邮件纯文本正文CSS残留问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 19:24:01