我需要解析转发邮件的电子邮件内容。我需要将电子邮件分为两类:
这是我的电子邮件内容:
---------- Forwarded message ----------
From: Khalil Ahmad <otheremail@gmail.com>
Date: Fri, May 12, 2017 at 10:27 AM
Subject: Re: Discussion
To: Hammad Rasheed <myemail@gmail.com>
ok no problem
On Fri, May 12, 2017 at 10:26 AM, Hammad Rasheed <myemail@gmail.com>
wrote:
> Great.
>
> I just want to check how this reply thing works
>
> On Fri, May 12, 2017 at 10:23 AM, Khalil Ahmad <otheremail@gmail.com> wrote:
>
>> yup fine
>>
>> On Fri, May 12, 2017 at 10:23 AM, Hammad Rasheed <myemail@gmail.com>
>> wrote:
>>
>>> Hi,
>>>
>>> How are you doing?
>>>
>>
>>
>
>
> --
> ---------------------------------------------------------------
> Hammad Rasheed
> Ph: 0332-123456
> myemail@gmail.com <myemail@gmail.com>
> Connect with me on Linkedin:
> http://www.linkedin.com/in/xxxxxxx
>
--
---------------------------------------------------------------
Hammad Rasheed
Ph: 0332-12345852
myemail@gmail.com <myemail@gmail.com>
Connect with me on Linkedin:
http://www.linkedin.com/in/xxxxxxx
--001a114b102aa2bdb7054f4d014a
我能够使用以下正则表达式提取所有转发的消息:
preg_match_all('~^>.*~m', $body, $secondary);
现在我需要发送的返回信息(最后一条),即#34;确定没问题&#34;不以&#34;&gt;&#34;开头的消息字符。但我无法为此制作正则表达式。
有人可以帮忙吗?
答案 0 :(得分:1)
你可以去
(?P<primary>(?:(?!^>).*\R))+
(?P<secondary>(?:^>.*\R)+)
在verbose
和multiline
模式下,请参阅a demo on regex101.com。
答案 1 :(得分:1)
我建议的解决方案是匹配以To:
开头的第一行和<...>
内包含类似电子邮件的字符串之间的任何文本,以及以{{1}开头的第一行跟随空格,一些字母,空格和数字(日期/时间)。这可以进一步增强,但想法将是相同的:
On
请参阅PHP demo
请注意修饰符:if (preg_match('~^To:[^<>]*\s+<[^>@]+@[^><]+>\s*(.*?)\ROn [A-Za-z]+, [A-Za-z]+ \d+, \d+ at \d+:\d+~ms', $email, $m)) {
echo $m[1];
}
。 /ms
修饰符可确保m
与行的开头匹配,^
可确保s
与行终止符匹配。
模式详情:
.
- 行首^
- 文字子字符串To:
- 除[^<>]*
和<
以外的0个字符(如有必要,请添加>
以保持同一行)\n\r
- 1+个空格(替换为\s+
以保持在仅匹配水平空格的同一行上)\h+
- <[^>@]+@[^><]+>
<...>
- 0+ whitespaces \s*
- 第1组:尽可能少的任何0 +字符(因为(.*?)
是惰性的,并且匹配尽可能少的有效匹配所需的字符*?
- 换行符\R
- 文字子字符串On [A-Za-z]+, [A-Za-z]+ \d+, \d+ at \d+:\d+
,空格和类似日期时间的模式(On
匹配1+个字母,[A-Za-z]+
匹配1+个数字。