在php中使用正则表达式从转发的电子邮件中获取最后发送的消息

时间:2017-05-19 07:00:21

标签: php regex email

我需要解析转发邮件的电子邮件内容。我需要将电子邮件分为两类:

  1. 主要内容(电子邮件的最新消息)
  2. 次要内容(电子邮件的所有其他消息)
  3. 这是我的电子邮件内容:

    ---------- 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;开头的消息字符。但我无法为此制作正则表达式。

    有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

你可以去

(?P<primary>(?:(?!^>).*\R))+
(?P<secondary>(?:^>.*\R)+)

verbosemultiline模式下,请参阅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+个数字。