разбивка текстового файла в PHP

Demon-MC

Новичок
разбивка текстового файла в PHP

Нужна ваша помошь знатоков)
есть игра онлайн у меня стоит сервер, вот там есть текстовый файл chat.log
туда выводится лог переписки из игры
текст там такого плана

[2010-11-04 01:57:54] [MESSAGE] - LEGION : [Диана]> это еще не босс
[2010-11-04 01:57:55] [MESSAGE] - GROUP <63843>: [Lessa]> чет я заблудилась))))
[2010-11-04 01:57:57] [MESSAGE] - GROUP <63843>: [Lex]> )
[2010-11-04 01:58:05] [MESSAGE] - LEGION : [Keeper]> на оффе хилл переагривает танка )
[2010-11-04 01:58:13] [MESSAGE] - GROUP <67194>: [Wood]> с настройками шото))))))
[2010-11-04 01:58:13] [MESSAGE] - LEGION : [No]> прилетел )
[2010-11-04 01:58:17] [MESSAGE] - ALL : [Keeper]> Всем привет
[2010-11-04 01:58:21] [MESSAGE] [Kai] Whisper To: Zak, Message: заепал
[2010-11-04 01:58:24] [MESSAGE] - LEGION : [Nomad]> ща буду
[2010-11-04 01:58:25] [MESSAGE] - LEGION : [Хаос]> Ну там под атк на пуху.
[2010-11-04 01:58:32] [MESSAGE] - LEGION : [No]> Мирабелла )
[2010-11-04 01:58:34] [MESSAGE] - LEGION : [Хаос]> И в щит.
[2010-11-04 01:58:43] [MESSAGE] - GROUP <64082>: [Aleksa]> где двое никого
[2010-11-04 01:58:47] [MESSAGE] - GROUP <64082>: [Aleksa]> ща там проверю
[2010-11-04 01:58:56] [MESSAGE] - GROUP <64082>: [Aleksa]> всм нет играков

мне надо сделать чтобы скрипт выводил последние строчки (20 сообщений) только строчки с ALL
те например надо придумать так чтоб скрипт выводил сначала все строчки в которых есть ALL:
[2010-11-04 01:58:17] [MESSAGE] - ALL : [Keeper]> Всем привет
[2010-11-04 02:58:15] [MESSAGE] - ALL : [Хаос]> привет

разбивал их по такому типу
[01:58:17] Keeper: Всем привет
[02:58:15] Хаос: привет

и выводил только последние 20 строчик, или больше
Заранее Благодарен
 

Demon-MC

Новичок
да лько вывод просто текста с лимитом строк

-~{}~ 11.04.10 13:48:

<?php
$str = file_get_contents('1.txt');
preg_match_all('/\[[0-9\-]+\s+([0-9:]+)\]\s+\[MESSAGE\]\s+-\s+ALL\s+:\s+\[([^\[\]]+)\]>\s+([^\n\r]+)/i', $str, $matches);foreach ($matches[1] as $index => $time) { echo '[' . $time . '] ' . $matches[2][$index] . ': ' . $matches[3][$index] . '<br>';}
?>
 

mity

Новичок
Совершенно не нужно читать весь файл, а если он 100 мегабайт?
PHP:
$RN="\r\n";//Признак перевода строки, уж не знаю какой он там у вас
	
if($fp = @fopen('1.txt', "rb")){
	$FileInfo=fstat($fp);
	$FileSize=$FileInfo['size'];
    
	//Отступ от конца файла, размер указан условно его можно и изменить
   	//в принципе надо стремиться к тому чтобы за первое чтение(цикл) были прочитанны все 20 строк		
	$Offset=10000;
		
	$CountReadLines=0;//количество прочитанных строк
	//Будем читать файл с конца, последовательно увеливая отступ
		
	//цикл пока не будет достигнуто начало файла, или прочитано 20 строчек
	while(($Offset<$FileSize) &&($CountReadLines<20)){
									
		$FilePos=max(0,$FileSize-$Offset);//Позиция относительно начала файла
		
		fseek($fp,$FilePos);     
		$str=fread($fp,$Offset);
        
		if($FilePos  >0){//если мы не начале файла
		 //Находим начало новой строки
  			$str=substr(strstr($str,$RN),strlen($RN));
		};//if($FilePos  >0)//если мы не начале файла
       
		//Ну уж не знаю насчёт правильности этого регулярного вырожения 
		preg_match_all('/\[[0-9\-]+\s+([0-9:]+)\]\s+\[MESSAGE\]\s+-\s+ALL\s+:\s+\[([^\[\]]+)\]>\s+([^'.$RN.']+)/i', $str, $matches);
					
		$BufOut="";//Выходной буфер
		$CountReadLines=0;
		
		foreach ($matches[1] as $index => $time) { 
			$BufOut.= '[' . $time . '] ' . $matches[2][$index] . ': ' . $matches[3][$index] . '<br>';
			$CountReadLines++;
			};
					 
					 
		$Offset*=2; //Увеличиваем отступ от конца файла
	};//while(($Offset<$FileSize) &&($CountReadLines<20))
	fclose($fp);
	echo $BufOut;	
};//if($fp = @fopen('1.txt', "rb"))
 
Сверху