正则表达式模式匹配电子邮件内联回复标题

时间:2012-11-06 18:28:43

标签: php regex preg-match

我在确定模式以识别电子邮件正文中的内联回复/转发的开头时遇到了一些麻烦,有些更简单的问题只是从“开始转发的邮件”开始,但回复有点更复杂:

On 12-06-13 10:56 AM, "John Doe" <john.doe@some.tld> wrote:

显然,常量将是“On”和“write:”。我希望能够只找到第一个匹配,然后在显示:无应用的div中将所有内容包装在后面,甚至只使用substr($ body,0,POSITION_OF_MATCH)消除它。

我遇到的一个问题是它没有抓住第一次发生,其次是我无法让贪婪得以正常工作。

到目前为止,我的进步(至少已经回归到部分工作版本)是:

preg_match("/On [^>]* wrote:/i",$content,$matches,PREG_OFFSET_CAPTURE);

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

我想知道您当前的版本是如何工作的,因为您无法匹配结束>。但你可以这样做:

$content = preg_replace('/(On [^>]*> wrote:).*$/s', '$1', $content);

这将匹配第一个On ... wrote:以及之后的所有内容,直到字符串结束。并仅使用On ... wrote:替换它。

答案 1 :(得分:1)

你可以用元素来打破这个;所以你基本上有:

On DATE, "NAME" <EMAIL> wrote:

然后,您可以对DATENAMEEMAIL进行定性。

  • DATE由数字,短划线,空格,冒号和字母组成。但是,它以逗号结尾,因此您可以使用逗号。
  • NAME由字母和空格组成,但它用引号分隔,你可以处理它。
  • EMAIL有点复杂,但电子邮件不能包含字符>,因此您应该能够捕获除此之外的所有内容。

所以你基本上得到:

On [anything but comma], "[anything but "]" <[anything but >]> wrote:

在正则表达式中,它类似于:

/^On ([^,]+), \"([^\"]+)\" <([^>]+)> wrote:$/

然后,当使用preg_match时,您可以从某些$matches数组获得匹配,索引1到3。

答案 2 :(得分:1)

我建议

$email = preg_match('/^On [^"]*"[^"]*" <([^>]*)> wrote:$/', $str, $re) ? $re[1] : '';

请参阅this demo

答案 3 :(得分:0)

我很欣赏其他答案,但是他们都没有真正考虑到我正在处理的回复字符串中的许多可能的变化,这可能是我没有正确解释或提供更多选项的错。尽管如此,我已经为每个人的努力+1了。

在打开和关闭一天之后,最终的解决方案似乎效果最好的是:

/On (Mon|Tue|Wed|Thu|Fri|Sat|Sun|[[:digit:]]{1,2})(.*?) wrote:/i

它开头的选项列表涵盖了一系列不同的回复类型,以“On Tue ...”或“On 23 ...”或“On 1 ...”等开头,确保贪婪我在抱怨没有从其他地方的随机“on”字符串中吸收太多,(。*?)负责其余的名称/电子邮件部分,最后跟进“write:”完成它。