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

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*:)以便像上面的示例中的Cc:行是一个单独的匹配。 预先感谢您的帮助。

你使用的是哪种编程语言/正则表达式?PHP吗? - instanceof me
是的,抱歉,我在使用 PHP 的 preg_match_all()。 - dlo
2个回答

1
你可以预处理字符串,在传递结果给parseAddressList函数之前删除<字符前的换行符。类似于使用/(?:\r?\n|\r)\s*</替换为<
$emails = Mail_RFC822::parseAddressList(preg_replace('/(?:\r?\n|\r)\s*</', '<', $emailHeaders));

这是一个相当合理的前进方式。顺便说一下,我认为你有一个多余的斜杠;应该是:/(?:\r?\n|\r)\s*< - dlo
这是一个不正确的操作。正确的折叠电子邮件标题的规范化方式是丢弃任何换行符后跟空格的内容。 - tripleee
@tripleee:我相信这是(普遍)观察到的,当你查看实际标头时,但我也在查看正文,例如,在转发消息块中,电子邮件客户端可能会格式化标头块,而不在分割标头行的开头放置空格。 - dlo

0

你觉得使用正则表达式的 s 操作符怎么样,这样 . 就可以匹配换行符了: /你的正则表达式/s


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接