Парсинг файла
У меня есть файл с таким содержанием в каждой строке
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);
###
Я бы посоветовал вам использовать регулярное выражение для анализа ваших данных. Сначала это немного сложно, но отлично справляется.