регулярное выражение preg_match, одна новая строка, но не две новые строки, пробелы и т. д. - PullRequest
1 голос
/ 06 октября 2011

У меня есть этот файл / строка:

   ----- 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 ]

2 голосов
/ 06 октября 2011

Две вещи:

  • Вам необходимо использовать модификатор //s, чтобы указать, что . может соответствовать символам новой строки.См. http://php.net/manual/en/reference.pcre.pattern.modifiers.php для получения подробной информации о модификаторах регулярных выражений в php.
  • Используйте .*?, чтобы указать не жадное совпадение (оно будет соответствовать самой короткой найденной строке).

Соберите все вместе:

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

Также обратите внимание: Если вы пытаетесь получить "--p94IAEl4012027.1317751814 / foo.com" как часть ваших результатов, то обратите внимание, чтоВы ищете три строки новой строки, а не две.Другими словами: две пустые строки == три символа новой строки.

0 голосов
/ 06 октября 2011

Другая проблема, о которой я мог подумать, это то, что вы ищете \n\n.Однако разрывы строк для передаваемых по сети данных обычно являются CRLF.Поэтому вам следует подготовиться к присутствию \r в конце:

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

Возможно, вы также захотите использовать .*? вместо .* или, возможно, .*+

...