我正在解析一些电子邮件。移动邮件,iPhone和我认为iPod touch将签名附加为单独的边界,使其易于删除。并非所有邮件客户端都这样做,只需使用“ - ”作为签名分隔符。
我需要从字符串中删除' - ',但只是最后一次出现。
样本副本
hello, this is some email copy-- check this out
--
Tom Foolery
我想要分裂' - ',删除最后一部分,我会拥有它,但是爆炸()和split()似乎都没有返回很好的值,让我知道它是否做了什么,在事件中没有比赛。
我无法让preg_replace跨越多行。我已将所有行结尾标准化为\ n
什么是最好的建议,最后得到“你好,这是一些电子邮件副本 - 检查出来”,没有,有些情况下没有签名,当然会有这样的情况:我无法涵盖所有案件。
答案 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'