简化正则表达式以减少递归

时间:2013-08-01 03:45:57

标签: regex

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

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

指向匹配如下所示的块:

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

(即 - 他们在一个连续的区块中),但如果有一个空行破坏该区块则不会,如下所示:

From: John Smith

Subject: cat videos

但我一直在发现使用它的PHP脚本有时候是segfaulting。我能够通过将pcre.recursion_limit设置为较低的数字(我使用8000)来缓解段错误,但是我发现我正在尝试做的事情应该是可行的而不需要大量的递归。我是否使用了一种非常低效的方法来捕捉\n\n

3 个答案:

答案 0 :(得分:2)

这对单个正则表达式来说只是一个可怕的用法。除了你遇到的性能问题之外,它还会出现直接的问题,例如在“From:”之前出现“Subject:”行的消息。如果你想解析一个RFC822电子邮件标题,那么你真的应该解析它。

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

或者找一个合适的库为你做这件事。

答案 1 :(得分:1)

您不应该使用正则表达式来可靠地解析邮件。最好使用PHP Mime Mail Parser来执行此任务。使用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');

答案 2 :(得分:0)

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

/^From:[^\n]*\nSubject:.+/msu