我目前有这样的正则表达式:
/^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
?
答案 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