preg_match正则表达式,一个新行但不是两个新行,空格等

时间:2011-10-05 23:32:00

标签: php regex whitespace

我有这个文件/字符串:

   ----- Transcript of session follows -----
... while talking to mta6.am0.yahoodns.net.:
>>> DATA
<<< 554 delivery error: dd Sorry your message to foo@yahoo.com cannot be delivered. This account has been disabled or discontinued [#102]. - mta1070.mail.ac4.yahoo.com
554 5.0.0 Service unavailable

--p94IAEl4012027.1317751814/foo.com


   ----- Transcript of session follows -----
... while talking to mail.messaging.microsoft.com.:
>>> DATA
<<< 550 5.7.1 Service unavailable; Client host [foo] blocked using Blocklist 2, mail from IP banned; To request removal from this list please forward this message to foo@foo.com.
550 5.1.1 <foo@foo.com>... User unknown
<<< 503 5.5.2 Need rcpt command

--p94I91SC011973.1317751741/foo.com
Content-Type: message/delivery-status

我需要在“会话记录跟随---”之后获得该部分,直到空白的新行(或者我认为是双new_line)。

我试过这样的事情

<?php preg_match("/----- Transcript of session follows -----\n(.*)\n\n/",$email, $transcript_matches);?>

但不正确,而不是.*我可能需要any char OR new line but NOT two new lines。紧接着它two new lines。我该怎么写呢?

谢谢。

2 个答案:

答案 0 :(得分:2)

两件事:

把它放在一起:

<?php preg_match("/----- Transcript of session follows -----\n(.*?)\n\n/s",$email, $transcript_matches);?>

另请注意:如果您尝试将“--p94IAEl4012027.1317751814 / foo.com”作为结果的一部分,请注意它是您要查找的三个换行符,而不是二。换句话说:两个空行==三个换行符。

答案 1 :(得分:0)

我能想到的另一个问题是你正在寻找\n\n。但是,网络传输数据的换行符通常是CRLF。因此,您应该为最后\r的存在做好准备:

 follows -----\s*\r?\n(.*)\r?\n\r?\n/s

您可能还想使用.*?代替.*,或者.*+