Парсер(информации, как файла так и из $_REQUEST(POST))

sunsword

Новичок
Парсер(информации, как из файла так и из $_REQUEST(POST))

Осуществлял парсер текстового файла, всё работало, всё было основано на отсеивании через переход на новую строчку (\n),
но после появления необходимости парсить инфу, которая приходит через $_REQUEST($_POST) возникла проблема, данный парсер не подходит, почему-то вместах где идёт \n\n он видит только один переход на новую строку (\n), кто-нибудь с этим сталкивался??

Пример текста для парсинга:
PHP:
2008.01.02 05:06

Victim: Humanor
Alliance: Tau Ceti Federation
Corp: Altera Odyssea
Destroyed: Jaguar
System: ****** Classified ***** 
Security: 0.0
Damage Taken: 3602

Involved parties:

Name: lorcar
Security: -1.8
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Myrmidon
Weapon: Hammerhead II
Damage Done: 1586

Name: Galeric
Security: 0.0
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Huginn
Weapon: Huginn
Damage Done: 990

Name: Ico Seduvaar (laid the final blow)
Security: 1.1
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Onyx
Weapon: Caldari Navy Scourge Heavy Missile
Damage Done: 594

Name: Machiu Troyan
Security: -1.2
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Hurricane
Weapon: Hurricane
Damage Done: 432


Destroyed items:

150mm Light AutoCannon II, Qty: 2
Republic Fleet Phased plasma S, Qty: 186
Flameburst Light Missile, Qty: 43
Upgraded 'Limos' Standard Missile Bay I
Medium Shield Extender II
Phased Monopropellant I Hydrazine Boosters
Warp Disruptor II
Republic Fleet Phased plasma S, Qty: 718 (Cargo)
Fusion S, Qty: 4000 (Cargo)
Barrage S, Qty: 1000 (Cargo)

Dropped items:

150mm Light AutoCannon II
Republic Fleet Phased plasma S, Qty: 93
'Langour' Drive Disruptor I
Power Diagnostic System II
Gyrostabilizer II
Overdrive Injector System II
Flameburst Light Missile, Qty: 456 (Cargo)
К примеру, для начала пробуем отпарсить инфу о дате:

PHP:
	$date_option="!(.*?)\n\nVictim:!si";
	preg_match_all($date_option, $content, $ok["date"]);
	$date_d = explode(" ", $ok["date"][1][0]);
	
	//echo "<pre>";print_r($date_d);echo "</pre>";
	
	list($year, $month, $days) = explode(".", $date_d[0]);
	list($hours, $min, $seconds) = explode(":", $date_d[1]);
	
	$date_r=Array(
	"DAYS"=>$days,
	"MONTH"=>$month,
	"YEAR"=>$year,
	"HOURS"=>$hours,
	"MIN"=>$min,
	"SECONDS"=>$seconds,
	"FULLDATE"=>$ok["date"][1][0]
	);
Теперь \n\nVictim: не отсеивает, хотя в текстовом файле, если это будет лежать, то всё будет круто, вообще не понимаю, маразм %)


Пример того, как парситься текстовый файл
 

Pigmeich

Новичок
sunsword
Как данные приходят в скрипт?

Точный код, пожалуйста. Если длинее 20 строк - лучше на everfall

Не забывайте, что двойной перенос строки (правда там CRLF) - стандартный разделитель заголовка сообщения и тела, а также сигнал конца сообщения.
 

Фанат

oncle terrible
Команда форума
Pigmeich
че-то ты да, больно заумно ответил. Хотя проблема там как раз в переводе строки. который не один \n
 

Pigmeich

Новичок
Ну, просто \n - это Line feed. Во многих системах и языках (допустим виндовском си) преобразуется в нормальный CRLF
 

sunsword

Новичок
И если не секрет, то как быть? :)))

Данные поступают через $_POST
 

kode

never knows best
Re: Парсер(информации, как из файла так и из $_REQUEST(POST))

Автор оригинала: sunsword
Осуществлял парсер текстового файла, всё работало, всё было основано на отсеивании через переход на новую строчку (\n),
но после появления необходимости парсить инфу, которая приходит через $_REQUEST($_POST) возникла проблема, данный парсер не подходит, почему-то вместах где идёт \n\n он видит только один переход на новую строку (\n), кто-нибудь с этим сталкивался??

Пример текста для парсинга:
PHP:
2008.01.02 05:06

Victim: Humanor
Alliance: Tau Ceti Federation
Corp: Altera Odyssea
Destroyed: Jaguar
System: ****** Classified ***** 
Security: 0.0
Damage Taken: 3602

Involved parties:

Name: lorcar
Security: -1.8
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Myrmidon
Weapon: Hammerhead II
Damage Done: 1586

Name: Galeric
Security: 0.0
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Huginn
Weapon: Huginn
Damage Done: 990

Name: Ico Seduvaar (laid the final blow)
Security: 1.1
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Onyx
Weapon: Caldari Navy Scourge Heavy Missile
Damage Done: 594

Name: Machiu Troyan
Security: -1.2
Alliance: Blackguard Coalition
Corp: Uninvited Guests
Ship: Hurricane
Weapon: Hurricane
Damage Done: 432


Destroyed items:

150mm Light AutoCannon II, Qty: 2
Republic Fleet Phased plasma S, Qty: 186
Flameburst Light Missile, Qty: 43
Upgraded 'Limos' Standard Missile Bay I
Medium Shield Extender II
Phased Monopropellant I Hydrazine Boosters
Warp Disruptor II
Republic Fleet Phased plasma S, Qty: 718 (Cargo)
Fusion S, Qty: 4000 (Cargo)
Barrage S, Qty: 1000 (Cargo)

Dropped items:

150mm Light AutoCannon II
Republic Fleet Phased plasma S, Qty: 93
'Langour' Drive Disruptor I
Power Diagnostic System II
Gyrostabilizer II
Overdrive Injector System II
Flameburst Light Missile, Qty: 456 (Cargo)
К примеру, для начала пробуем отпарсить инфу о дате:

PHP:
	$date_option="!(.*?)\n\nVictim:!si";
	preg_match_all($date_option, $content, $ok["date"]);
	$date_d = explode(" ", $ok["date"][1][0]);
	
	//echo "<pre>";print_r($date_d);echo "</pre>";
	
	list($year, $month, $days) = explode(".", $date_d[0]);
	list($hours, $min, $seconds) = explode(":", $date_d[1]);
	
	$date_r=Array(
	"DAYS"=>$days,
	"MONTH"=>$month,
	"YEAR"=>$year,
	"HOURS"=>$hours,
	"MIN"=>$min,
	"SECONDS"=>$seconds,
	"FULLDATE"=>$ok["date"][1][0]
	);
Теперь \n\nVictim: не отсеивает, хотя в текстовом файле, если это будет лежать, то всё будет круто, вообще не понимаю, маразм %)


Пример того, как парситься текстовый файл
[offtopic]
Что за игра? EVE Online?
[/offtopic]
 

kode

never knows best
Попробуй написать парсер на основе stateов и читать построчно.

Да, ну как и говорилось - \r\n
 

Pigmeich

Новичок
sunsword
Ага, значит все-таки дело в неправильном разделителе.

Я использую такую идиому:
/(\n|\r|\r\n)(?:\1){1}/m

-~{}~ 03.01.08 05:44:

\r - это маковский стиль переноса.
 
Сверху