Php 解析文件

Php 解析文件,php,cakephp,cakephp-1.3,Php,Cakephp,Cakephp 1.3,我有一个文件,每行都有这样的内容 3021e69d9d2569db27ce7b74ccaa98496007de09a1f4b94e45f48203d8727ac6 test.com [05/Jul/2011:07:28:57 +0000] 126.97.98.19 3021e69d9d2569db27ce7b74ccaa98496007de09a1f4b94e45f48203d8727ac6 70706DF22A809F33 REST.GET.OBJECT 1as21/foldera/file.

我有一个文件,每行都有这样的内容

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);
                      ......

问题是,我用空格来划分这条线,以达到这个目的。然而,它造成了超出必要的分歧。有没有办法做得更好?是否有一个空格字符是我应该寻找的,它不会将“…”中的任何内容作为空格计算?当它计算“GET//”时,即使它清楚地包含在“

中,我建议您使用正则表达式来解析数据。开始时有点棘手,但做得很好


我建议您使用正则表达式来解析数据。起初有点棘手,但做得很好

使用PHP。它是为这个场景设计的。这个问题在堆栈溢出问题上有不同的答案。尽管如此,我还是为您编写了一个快速脚本。我认为可以从几个方面进行改进

它使用两个被动组对输入字符串求值,最后一个表达式是用空格分隔符分隔字符串的表达式

###
$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=yehn847bhdsauernymjne=HTTP/1.1“206-47972352 209316737 541940911”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=使用PHP。它是为这个场景设计的。这个问题在堆栈溢出问题上有不同的答案。尽管如此,我还是为您编写了一个快速脚本。我认为可以从几个方面进行改进

它使用两个被动组对输入字符串求值,最后一个表达式是用空格分隔符分隔字符串的表达式

###
$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=yehn847bhdsauernymjne=HTTP/1.1“206-47972352 209316737 541940911”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=
###     
$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);
###