电子邮件地址列表的正则表达式可能跨越多行

时间:2013-07-18 16:46:10

标签: php regex

我想扫描电子邮件正文,查找转发电子邮件中的电子邮件地址列表,例如:

From: John Smith <john@example.com>
To: Jane Smith <jane@example.com>, Mary Smith
<mary@example.com>
Cc: Ed Smith <ed@example.com>
Subject: this is a test

我将使用Mail_RFC822::parseAddressList()来完全解析每个列表(有很多细节可以直接在那里,所以我不应该尝试重新设计它),但我确实想要拔出线去交给这个功能。我有一个简单的正则表达式,只查找带有电子邮件地址的行,并且大部分时间都可以使用。

但是在野外,有时会发送类似上面示例的电子邮件,其中名称和地址会分成不同的行。如果我逐行执行,上面的To:行的上半部分将无法在parseAddressList()中解析,因为没有地址的名称无效;并且下半部分将解析,但将丢失名称,该名称位于上一行。

所以我需要一个可以同时查看多行的正则表达式,这使我的专业知识之外的事情变得复杂。只要一直找到一个基本的电子邮件模式([\w\.\+\-]+@[\w\.\-]+\.[\w\.\-]+ ......不需要完美),但在行的开头没有单词冒号组合,一个适当的解决方案将继续将行组合在一起( ^\S*:)所以,如上例所示,Cc:line是一个单独的匹配。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以预处理字符串以删除<个字符之前的新行,然后将结果传递给parseAddressList函数。

/(?:\r?\n|\r)\s*</替换为<

$emails = Mail_RFC822::parseAddressList(preg_replace('/(?:\r?\n|\r)\s*</', '<', $emailHeaders));

答案 1 :(得分:0)

如何使用正则表达式s运算符,以便.也匹配换行符:/your regex/s