3

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

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*:),这样,如在上面的示例中,抄送:行是一个单独的匹配项。在此先感谢您的帮助。

4

2 回答 2

1

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

类似于替换/(?:\r?\n|\r)\s*</<

$emails = Mail_RFC822::parseAddressList(preg_replace('/(?:\r?\n|\r)\s*</', '<', $emailHeaders));
于 2013-07-18T16:59:48.147 回答
0

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

于 2013-07-19T08:47:52.010 回答