2012-03-13 33 views
0

我正在創建一個腳本,用於查找服務器上的所有error_log文件。下面是一個典型的error_log文件的樣本:preg_match_all多行

[08-Feb-2012 05:45:56] PHP Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given [] does not comply with RFC 2822, 3.6.2.' in /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php:308 
Stack trace: 
#0 /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php(238): Swift_Mime_Headers_MailboxHeader->_assertValidAddress('') 
#1 /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php(96): Swift_Mime_Headers_MailboxHeader->normalizeMailboxes(Array) 
#2 /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php(60): Swift_Mime_Headers_MailboxHeader->setNameAddresses(Array) 
[08-Feb-2012 05:46:18] PHP Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given [] does not comply with RFC 2822, 3.6.2.' in /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php:308 
Stack trace: 
#0 /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php(238): Swift_Mime_Headers_MailboxHeader->_assertValidAddress('') 
#1 /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php(96): Swift_Mime_Headers_MailboxHeader->normalizeMailboxes(Array) 
#2 /lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php(60): Swift_Mime_Headers_MailboxHeader->setNameAddresses(Array) 
[15-Feb-2012 15:39:10] PHP Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting ']' in /settings.php on line 47 

我用下面的代碼單獨提取每一個錯誤,所以我可以方便查看顯示它們

preg_match_all('/\[\d{2}-\w{3}-\d{4} \d{2}:\d{2}:\d{2}\].*/', $error_log_file, $error_log_parts); 

它的工作,但問題是它沒有選擇多行。

Array 
(
    [0] => Array 
    (
     [0] => [08-Feb-2012 05:45:56] PHP Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given [] does not comply with RFC 2822, 3.6.2.' in /home/elvanto/public_html/lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php:308 
     [1] => [08-Feb-2012 05:46:18] PHP Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given [] does not comply with RFC 2822, 3.6.2.' in /home/elvanto/public_html/lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php:308 
     [2] => [15-Feb-2012 15:39:10] PHP Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting ']' in /home/elvanto/public_html/roster-settings.php on line 47 
    ) 

) 

所以我添加一個 's' 來結尾:

preg_match_all('/\[\d{2}-\w{3}-\d{4} \d{2}:\d{2}:\d{2}\].*/s', $error_log_file, $error_log_parts); 

但現在看來,選擇一切。我需要一種方法來選擇所有內容,直到遇到新的日期。例如:[08-Feb-2012 05:46:18]

需要添加什麼代碼才能做到這一點?

回答

1

嘗試像

/\[\d{2}-\w{3}-\d{4} \d{2}:\d{2}:\d{2}\].*?(?=^\[)/s 

.*已經變成非貪婪.*?(?=^\[)已經被添加到強制.*?匹配,直到它找到開始[一個換行符。另外,如果你看到一個\[\d{2}-\w{3}-\d{4} \d{2}:\d{2}:\d{2}\]並且連接到當前的數組入口,否則你可以連續讀取日誌文件的行,開始一個新的數組入口 - 否則,你不必放屁.*/s開關。

+0

謝謝!出於某種奇怪的原因,你的代碼最初並不起作用......玩完之後,我終於明白了這一點: /\ [\ d {2} - \ w {3} - \ d {4} \ d { 2}:\ d {2}:\ d {2} \]。*?(?= \ [\ d {2} - \ w {3} - \ d {4} \ d {2} 2}:\ d {2} \])/ s – 2012-03-13 00:26:21

+0

是的,不確定前視中的^是否會起作用。你必須工作的正則表達式應該已經逃脫了''和''''。即'(?= \ [\ d {2} ...... \])'。 – 2012-03-13 00:34:19

+0

如何製作(?= \ [\ d {2} - \ w {3} - \ d {4} \ d {2}:\ d {2}:\ d {2} \])部分可選?例如,最後一個錯誤代碼沒有被拾取,因爲它之後沒有換行符。我嘗試了一些東西,但無法讓它工作... – 2012-03-13 01:59:08