Разбор с неизвестной длиной строки в PHP? - PullRequest
2 голосов
/ 03 декабря 2011

Я получил следующую выдержку из лог-файла, и мне нужно перебрать все между 'NC:' и 'VL #' или 'Всего уровней нарушений до сих пор #.'Любые мысли о том, как я мог бы получить эту строку, учитывая, что длина неизвестна и нет простого разделителя?

11.11.27 14:50:41 [ПРЕДУПРЕЖДЕНИЕ] NC: elvefromhell провалил бой.noswing: не качал руку.VL 3

11.11.27 14:50:54 [INFO] NC: Jackmac19 не удалось fight.direction: попытался атаковать объект вне поля зрения.Общий уровень нарушений до сих пор 5.

11.11.27 14:51:02 [ПРЕДУПРЕЖДЕНИЕ] NC: Ошибка6968 ошибка chat.spam: Последнее отправленное сообщение "t".VL 1

11.11.27 14:51:26 [ПРЕДУПРЕЖДЕНИЕ] NC: Убежден, сбой chat.spam: Последнее отправленное сообщение "hi pherce".VL 1

11.11.27 14:51:48 [ПРЕДУПРЕЖДЕНИЕ] NC: UmbraSprite не удалось blockbreak.noswing: не качать руку.VL 2

11.11.27 14:51:59 [INFO] NC: AwayDood не удалось переместиться.running.vertical.VL 2

11.11.27 14:52:17 [INFO] NC: AwayDood не удалось переместиться.running.vertical.VL 11

11.11.27 14:52:35 [INFO] NC: AwayDood не удалось переместиться.running.vertical.VL 11

11.11.27 14:53:06 [ПРЕДУПРЕЖДЕНИЕ] NC: AwayDood не удалось перебить block.noswing: не качать руку.VL 4

Ответы [ 5 ]

3 голосов
/ 03 декабря 2011

Использование регулярного выражения:

$text = '11.11.27 14:50:54 [INFO] NC: Jackmac19 failed fight.direction: tried to attack out of sight entity. Total violation level so far 5.';

preg_match('/NC: (.*)?\s(VL|Total violation level so far)/', $text, $matches);
echo $matches[1];

Это будет работать по одной строке за раз.Его можно настроить для работы с большим фрагментом журнала, но кажется более разумным обрабатывать журнал по очереди за раз.

См. Это в действии .

0 голосов
/ 03 декабря 2011

Вы можете попробовать регулярные выражения (регулярные выражения):

/NC:(.*)(?=VL|Total violation level so far)/
0 голосов
/ 03 декабря 2011

Без использования регулярного выражения (следующий код можно было бы оптимизировать, но я оставил его таким, чтобы было понятнее, что происходит):

$end = strlen($string);
if(false !== strpos($string, 'VL ')) {
    $end = strpos($string, 'VL ');
} else if(false !== strpos($string, 'Total violation level so far ')) {
    $end = strpos($string, 'Total violation level so far ');
}

$string = substr($string, strpos($string, 'NC: '), $end);

$string будет содержать одну строку вашего журналафайл.Чтобы получить все строки файла журнала в массиве, чтобы облегчить это, вы должны сделать что-то вроде этого:

$lines = file('/path/to/file.ext');
0 голосов
/ 03 декабря 2011

без использования регулярных выражений, вы можете просто разделить на NC:

foreach($lines as $line){
    list(,$text) = explode('NC:',$line);
    print $line;
}
0 голосов
/ 03 декабря 2011

Это быстро и грубо, но работает с учетом этого журнала. Будьте осторожны, если ваш формат файла журнала когда-либо изменится.

preg_match_all('/NC: (.*?) (?:VL|Total violation level so far)/i', $subject, $result);
...