从电子邮件正文中删除签名的最佳方法
题
我正在解析一些电子邮件。Mobile Mail、iPhone 和 iPod touch 会附加一个签名作为单独的边界,使其易于删除。并非所有邮件客户端都这样做,只是使用“--”作为签名分隔符。
我需要从字符串中删除“--”,但只删除最后一次出现的“--”。
样本副本
hello, this is some email copy-- check this out
--
Tom Foolery
我考虑过拆分“--”,删除最后一部分,我会拥有它,但是explode()和split()似乎都没有返回很大的值来让我知道它是否做了什么,如果没有的话一场比赛。
我无法让 preg_replace 跨越多行。我已将所有行结尾标准化为
以“你好,这是一些电子邮件副本 - 请检查一下”结束的最佳建议是什么,不考虑,会有没有签名的情况,当然也有我不能签名的情况涵盖所有情况。
解决方案 4
我认为的是更防弹兴趣,我将采取非正则表达式路线
echo substr($body, 0, strrpos($body, "\n--"));
其他提示
实际上正确的签名定界符是"-- \n"
(注意换行符之前的空间) ,因此,正则表达式定界符应该'^-- $'
。虽然你可能会考虑使用'^--\s*$'
,所以它会与OE工作,它得到它错了。
尝试这种情况:
preg_replace('/--[\r\n]+.*/s', '', $body)
这将--
的第一次出现,随后一个或多个换行符后除去一切。如果你只是想删除最后一个实例,使用/.*--[\r\n]+.*/s
代替。
而不是刚好经过切碎的一切 - 你能不能缓存由该用户或服务,并比较发送的最后几封电子邮件。在底部,看起来像其他的位可以安全地去除,留下适当的消息完好。
这似乎给了我最好的结果:
$body = preg_replace('/\s*(.+)\s*[\r\n]--\s+.*/s', '$1', $body);
- 它将匹配并修剪最后一个“(换行符)--(可选空格/换行符)(签名)”
- 修剪签名前所有剩余的换行符
- 修剪正文中的开头/结尾空格(签名前剩余的换行符、正文开头的空格等)
- 仅当签名之前有一些文本(非空白)时才有效(否则它不会剥离签名并完整返回)
不隶属于 StackOverflow