1

我目前有一个这样的正则表达式:

/^From: ((?!\n\n).)*\nSubject:.+/msu

匹配一个看起来像这样的块:

From: John Smith
Cc: Jane Smith
Subject: cat videos

(即它们在一个连续的块中)但如果有一个空白行打破了块,则不是,如下所示:

From: John Smith

Subject: cat videos

但我一直发现使用它的 PHP 脚本有时会出现段错误。我可以通过将 pcre.recursion_limit 设置为较低的数字(我使用 8000)来减轻段错误,但我突然想到,我正在尝试做的事情应该可以在没有大量递归的情况下实现。我是否使用了一种非常低效的方法来捕捉\n\n

4

3 回答 3

2

这只是单个正则表达式的可怕用途。除了您遇到的性能问题之外,它还会在简单的问题上失败,例如“主题:”行出现在“发件人:”之前的消息。如果您想解析一个 RFC822 电子邮件标头,那么您真的应该解析它。

找到标题的空行终止符。将以空格开头的行连接到前一行(即用空格替换 newline-followed-by-whitespace)。在第一个冒号处拆分每一行,并从每一侧剪掉前导和尾随空格。

或者找一个合适的图书馆为你做这件事。

于 2013-08-01T04:39:15.650 回答
1

您不应该使用正则表达式来可靠地解析邮件消息。最好使用PHP Mime 邮件解析器来完成此任务。使用Mime Mail Parser code将非常简单:

require_once('MimeMailParser.class.php');

$path = 'path/to/mail.txt';

$Parser = new MimeMailParser();
$Parser->setPath($path);

$to       = $Parser->getHeader('to');
$from     = $Parser->getHeader('from');
$subject  = $Parser->getHeader('subject');
$textBody = $Parser->getMessageBody('text');
$htmlBody = $Parser->getMessageBody('html');
于 2013-08-01T05:19:40.023 回答
0

我会简单地使用“不是换行符”:

/^From:[^\n]*\nSubject:.+/msu
于 2013-08-01T04:26:24.273 回答