我正在解析一些电子邮件。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);

  • 它将匹配并修剪最后一个“(换行符)--(可选空格/换行符)(签名)”
  • 修剪签名前所有剩余的换行符
  • 修剪正文中的开头/结尾空格(签名前剩余的换行符、正文开头的空格等)
  • 仅当签名之前有一些文本(非空白)时才有效(否则它不会剥离签名并完整返回)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top