2012-03-13 2 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-фев-2012 05:46:18]

Какой код мне нужно добавить для этого?

ответ

1

Try что-то вроде

/\[\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}: \ d { 2}: \ d {2} \])/s –

+0

Да, не был уверен, будет ли '^' в lookahead работать. Вашему регулярному выражению, которое вы должны работать, должно быть экранировано '[' и ']'. т. е. '(? = \ [\ d {2} ...... \])'. –

+0

Как сделать (? = \ [\ D {2} - \ w {3} - \ d {4} \ d {2}: \ d {2}: \ d {2} \]) часть опциональной ? Например, самый последний код ошибки не подбирается, потому что после него нет разрыва строки. Я пробовал несколько вещей, но не могу заставить его работать ... –

Смежные вопросы