我有这个文件/字符串:
----- 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
。我该怎么写呢?
谢谢。
答案 0 :(得分:2)
两件事:
//s
修饰符来指定.
可以匹配换行符。有关php中正则表达式修饰符的详细信息,请参阅http://php.net/manual/en/reference.pcre.pattern.modifiers.php。.*?
指定非贪婪匹配(它将匹配找到的最短字符串)。把它放在一起:
<?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
您可能还想使用.*?
代替.*
,或者.*+