Парсинг файла

У меня есть файл с таким содержанием в каждой строке

3021e69d9d2569db27ce7b74ccaa98496007de09a1f4b94e45f48203d8727ac6 test.com [05/Jul/2011:07:28:57 +0000] 126.97.98.19 3021e69d9d2569db27ce7b74ccaa98496007de09a1f4b94e45f48203d8727ac6 70706DF22A809F33 REST.GET.OBJECT 1as21/foldera/file.png "GET //folder/test.php?AWSAccessKeyId=45dsgrg$5f&Expires=1310388787&Signature=Yehn847BhdsaiuernYmjne= HTTP/1.1" 206 - 47972352 209316737 54194091 7 "http://test.info/?url=http://ns.in/54325" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" -

Поэтому я использовал следующий код для разбора

$file_handle = fopen($filename, "r");
            while (!feof($file_handle)) {
              $data = fgets($file_handle);
              $test = explode(" ",$data);
                      ......

Проблема в том, что я делю строку с пробелами, чтобы добраться до этого 206. Однако, это делает больше делений, чем необходимо. Есть ли далеко, чтобы сделать это лучше? Есть ли пробел, который я должен искать, который ничего не будет считать в "..." пробелом? Так как он считается "GET //, хотя он явно заключен в" "

2 ответа

Решение

Используйте PHP preg_split. Он был разработан для этого сценария. На этот вопрос ответили по-разному в переполнении стека. Тем не менее я сделал быстрый сценарий, который сделает это для вас. Я думаю, что это можно улучшить несколькими способами.

Он использует 2 пассивные группы для оценки входной строки с последним выражением, которое разделяет строку с пробелом.

Пример сценария preg_split в Gist

###     
$str = '3021e69d9d2569db27ce7b74ccaa98496007de09a1f4b94e45f48203d8727ac6 test.com [05/Jul/2011:07:28:57 +0000] 126.97.98.19 3021e69d9d2569db27ce7b74ccaa98496007de09a1f4b94e45f48203d8727ac6 70706DF22A809F33 REST.GET.OBJECT 1as21/foldera/file.png "GET //folder/test.php?AWSAccessKeyId=45dsgrg$5f&Expires=1310388787&Signature=Yehn847BhdsaiuernYmjne= HTTP/1.1" 206 - 47972352 209316737 54194091 7 "http://test.info/?url=http://ns.in/54325" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" -';


$regex = <<<REG
 /"((?:[^"]*|)++)\"
 |\[((?:[^\]]*|)++)\]
 |[\s]
/x
REG;

$out = preg_split($regex,$str,0,PREG_SPLIT_DELIM_CAPTURE );

var_dump($out);
###

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

preg_match - выполняет сопоставление регулярного выражения

Другие вопросы по тегам