3

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

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

样本副本

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

我考虑过拆分'--',删除最后一部分,我会拥有它,但如果没有匹配项,似乎都没有返回很好的价值让我知道它是否做了任何事情explode()split()

我不能preg_replace()超过一条线。我已将所有行尾标准化为\n.

最好的建议是什么hello, this is some email copy-- check this out,不接受,会有没有签名的情况,当然也会有我无法涵盖所有​​情况的情况。

4

6 回答 6

8

实际上正确的签名分隔符"-- \n"(注意换行符之前的空格),因此分隔符正则表达式应该是'^-- $'. 虽然您可能会考虑使用'^--\s*$',但它会与 OE 一起使用,但会出错。

于 2009-04-07T12:22:39.570 回答
3

试试这个:

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

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

于 2009-04-07T12:24:46.820 回答
3

您不能缓存该用户或服务发送的最后几封电子邮件并进行比较,而不仅仅是在之后砍掉所有内容。底部看起来像其他的位可以安全地移除,而正确的消息完好无损。

于 2009-04-07T12:40:14.067 回答
3

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

        echo substr($body, 0, strrpos($body, "\n--"));
于 2009-04-07T22:57:39.730 回答
2

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

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

  • 它将匹配并修剪最后一个“(换行)--(可选空格/换行)(签名)”
  • 修剪签名前所有剩余的换行符
  • 修剪正文的开始/结束空格(签名前的剩余换行符,正文开头的空格等)
  • 仅当签名前有一些文本(非空白)时才有效(否则它不会剥离签名并将其原封不动地返回)
于 2012-11-12T03:02:38.187 回答
0

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

代码:(演示

$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'
于 2021-03-10T14:44:45.663 回答