Разбить строку с помощью preg_split

Arceny

Новичок
Разбить строку с помощью preg_split

Здравствуйте! Нужно разбить строку log файла вида

10.128.62.212 - - [13/Dec/2008:17:29:19 +0300] "GET /mediawiki/index.php/%d0%9a%d1%83%d1%80%d1%81%d0%be%d0%b2%d0%b0%d1%8f_%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0_%d0%bf%d0%be_%d0%b4%d0%b8%d1%81%d1%86%d0%b8%d0%bf%d0%bb%d0%b8%d0%bd%d0%b5_\"%d0%a1%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5_%d0%b8_%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5_Web-%d1%83%d0%b7%d0%bb%d0%be%d0%b2\" HTTP/1.0" 200 11844 "http://lug32.b-metro.net/mediawiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:MovePage&action=submit" "Mozilla/5.0 (X11; U; Linux x86_64; ru-RU; rv:1.9.0.4) Gecko/2008112309 Iceweasel/3.0.4 (Debian-3.0.4-1)"
193.110.113.77 - "" [13/Dec/2008:10:37:01 +0300] "HEAD /forum/index.php HTTP/1.0" 200 - "-" "Mozilla/3.0 (compatible; Indy Library)"
10.106.1.158 - - [13/Dec/2008:10:37:34 +0300] "GET /vangog/i/4/8/485a62c80240f.jpg HTTP/1.0" 404 401 "http://forum.b-metro.net/viewtopic.php?f=78&t=12512&start=50" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
66.249.71.57 - - [13/Dec/2008:10:38:36 +0300] "GET /forum/viewtopic.php?f=12&t=322&start=0 HTTP/1.0" 200 6046 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

На подстроки. Как видно разделитель - пробел, но строки в кавычках тоже содержат пробелы, поэтому просто split'ать не получается. Посему необходимо написать регулярное выражение для preg_split которое реализовывало бы функционал заложеный в фразе "пробел, слева и справа от которого стоит цифра или небуква является разделителем" ...

Я много чего пытался, всяких извратов, но толком не получилось разделить.

Поэтому прошу помощи. Мне кажется что пример тривиален а я в силу того что знаком с регулярными выражениями 1й день не могу его осилить :unsure:
 

С.

Продвинутый новичок
Пробелы в элементах (кроме последнего) везде расставлены одинаково. Собрать разрозненные элементы в один не составит труда. В последний элемент собирается все оставшееся.
 

pilot911

Новичок
Re: Разбить строку с помощью preg_split

парсят обычно вот так



PHP:
  function format_log_line($line)
  {
    preg_match("/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/", $line, $matches); // pattern to format the line
    return $matches;
  }

  function format_line($line)
  {
    $logs = $this->format_log_line($line); // format the line

    if (isset($logs[0])) // check that it formated OK
    {
      $formated_log = array(); // make an array to store the lin info in
      $formated_log['ip'] = $logs[1];
      $formated_log['identity'] = $logs[2];
      $formated_log['user'] = $logs[2];
      $formated_log['date'] = $logs[4];
      $formated_log['time'] = $logs[5];
      $formated_log['timezone'] = $logs[6];
      $formated_log['method'] = $logs[7];
      $formated_log['path'] = $logs[8];
      $formated_log['protocal'] = $logs[9];
      $formated_log['status'] = $logs[10];
      $formated_log['bytes'] = $logs[11];
      $formated_log['referer'] = $logs[12];
      $formated_log['agent'] = $logs[13];
      return $formated_log; // return the array of info
    }
    else
    {
      $this->badRows++; // if the row is not in the right format add it to the bad rows
      return false;
    }
  }


строки в format_log_line() передаешь из текстового файла через fgets()
 

Arceny

Новичок
Я так и написал собственно в первый раз, однако! Это регулярное выражение ОЧЕНЬ тормозное и тысяча строк через него идут секунду. В то же время версия с разрубкой работает раз в 50-60 быстрей.
 
Сверху