从电子邮件正文中删除签名的最佳方式

时间:2009-04-07 12:17:14

标签: php regex parsing split explode

我正在解析一些电子邮件。移动邮件,iPhone和我认为iPod touch将签名附加为单独的边界,使其易于删除。并非所有邮件客户端都这样做,只需使用“ - ”作为签名分隔符。

我需要从字符串中删除' - ',但只是最后一次出现。

样本副本

 hello, this is some email copy-- check this out
 --
 Tom Foolery

我想要分裂' - ',删除最后一部分,我会拥有它,但是爆炸()和split()似乎都没有返回很好的值,让我知道它是否做了什么,在事件中没有比赛。

我无法让preg_replace跨越多行。我已将所有行结尾标准化为\ n

什么是最好的建议,最后得到“你好,这是一些电子邮件副本 - 检查出来”,没有,有些情况下没有签名,当然会有这样的情况:我无法涵盖所有​​案件。

6 个答案:

答案 0 :(得分:8)

实际上correct signature delimiter"-- \n"(请注意换行前的空格),因此分隔符regexp应为'^-- $'。虽然您可能会考虑使用'^--\s*$',但它会与OE一起使用,这会导致错误。

答案 1 :(得分:3)

试试这个:

preg_replace('/--[\r\n]+.*/s', '', $body)

这将删除--第一次出现后跟一个或多个换行符后的所有内容。如果您只想删除最后一次出现,请改用/.*--[\r\n]+.*/s

答案 2 :(得分:3)

不是只是砍掉所有内容后 - 你不能缓存该用户或服务发送的最后几封电子邮件并进行比较。可以安全地移除底部看起来像其他位置的位,保留正确的消息。

答案 3 :(得分:3)

我认为为了更加防弹,我将采用非正则路线

        echo substr($body, 0, strrpos($body, "\n--"));

答案 4 :(得分:2)

这似乎给了我最好的结果:

$body = preg_replace('/\s*(.+)\s*[\r\n]--\s+.*/s', '$1', $body);

  • 它将匹配并修剪最后一个"(换行符) - (可选的空格/换行符)(签名)"
  • 在签名之前修剪所有剩余的换行符
  • 修剪身体的开始/结束空白(签名前的剩余换行符,身体开头的空格等)
  • 只有在签名前有一些文字(非空白)才能使用(否则它不会剥离签名并保持原封不动)

答案 5 :(得分:0)

要彻底删除所有签名及其前导换行符,请执行贪婪匹配直到最后出现的 --。在匹配最后一个 -- 后跟零个或多个空格然后是与系统无关的换行符之前,使用 \K 重新开始全字符串匹配,然后匹配所有要替换的剩余字符串。

代码:(Demo)

$string = <<<BODY
hello, this is some email copy-- check this out
--
Tom Foolery
BODY;

var_export(preg_replace('~.*\K\R-- *\R.*~s', '', $string));

输出:

'hello, this is some email copy-- check this out'