Как разбить строку на переменные? preg_split...

Guest111

Guest
Как разбить строку на переменные? preg_split...

Имеется строка следующего содержания:
www.site.ru 127.0.0.1 - - [03/Jan/2006:00:18:53 +0300] "GET /script.php HTTP/1.1" 200 14872 "http://site.ru/script.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"
Хочу поделить эту строку на переменные - сепаратор (разделитель): пробел. В принципе здесь может справиться и explode..
Но!
Вот эту часть:
[03/Jan/2006:00:18:53 +0300]
хотелось бы получить в одну переменную несмотря на то, что там стоит пробел, как собственно и эту:
"GET /script.php HTTP/1.1"

т.е. если есть квадратные скобки или кавычки то пробелы внутри их не учитывать...
Возможно, что здесь справится preg_split? Но как здесь в таком случае им воспользоваться?
 

SiMM

Новичок
[m]fgetcsv[/m]
> хотелось бы получить в одну переменную
Конкатенация для вас настолько большая проблема?
 

Guest111

Guest
SiMM
т.е. разрубить а потом обратно "срубить"?:)
это файл 40 мб.. порядка миллиона строк... если я так на каждой итерации буду разрубать, а потом опять срубать.. :)

-~{}~ 29.01.06 09:13:

в принципе конкатенация подпадает только в данном случае, а если кол-во пробелов может быть неограниченным в кавычках..?
 

SmokyPython

Новичок
Guest111
В таких случаях разделителем не пробел а табуляцию обычно используют. Если ты скрипт лога формируешь, камень в твой огород.
 

Фанат

oncle terrible
Команда форума
SmokyPython
нет, скрипт лога не он формирует.
так что, это камень в твой огород.
 

white phoenix

Новичок
'~^([a-z0-9\-\.\_]+)\s(\d+\.\d+\.\d+\.\d+)\s\-\s(\w*)\s?-\s\[([^\]]+)\]\s"([^"]+)"\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+)$~mxi'
host - 1, ip - 2, authname - 3, date - 4, uri - 5, errno - 6, size - 7, ref - 8, agent - 9
 

Фанат

oncle terrible
Команда форума
white phoenix
если подумать (тем местом, которое у тебя отсутствует), то такая детализация не нужна. в большинстве мест достаточно, действительно, \S+ и паттерн получится раз в 5 меньше

-~{}~ 29.01.06 18:33:

а вообще, лог какой-то странный.
 

svetasmirnova

маленький монстрик
Фанат
Его же как угодно формировать можно, чего странного?
 

white phoenix

Новичок
Фанат
Апендиксом и правда не думаю :) Ведь на \S+ можно заменить подстроки у которых нет пробелов (это по самому определению \S). Вот:
'~^(\S+)\s(\S+)\s\-\s(\S*)\s?-\s\[([^\]]+)\]\s"([^"]+)"\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+)$~mxi'
> а вообще, лог какой-то странный.
Возможно изменили в конфиге Apache.
 

Guest111

Guest
Фанат
Спасибо большое!
На счет ПрэгМэтча почему-то не додумался, знаю знаю чем думаю:)

Отличный шаблон!
Для тех кто будет парсить подобный формат - возьмите \d+ в скобки, чтобы код работы и переданный размер клиенту также учитывались в выборке.

Спасибо ещё раз!
 
Сверху