2017-02-24 99 views
2

我有以下的日志:PHP - 解析新线日志

#VERSION: 2.9 2017-02-24 10:03:39 channel_ping 1afcd2e2857045fe973e7ed036ea450c dfe17897d80b44f6901593364fc72b55 2479884 127.0.0.1 Mozilla/5.0%20(Macintosh;%20Intel%20Mac%20OS%20X%2010_11_6)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/56.0.2924.87%20Safari/537.36 https://test.com/ TEST-User-50187 42134f99b57240d19e05f760800a9dc6

我可以读的这个内容在PHP没有问题,输出:

#VERSION: 2.9\n 2017-02-24\t10:03:39\tchannel_ping\t1afcd2e2857045fe973e7ed036ea450c\tdfe17897d80b44f6901593364fc72b55\t2479884\t127.0.0.1\tMozilla/5.0%20(Macintosh;%20Intel%20Mac%20OS%20X%2010_11_6)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/56.0.2924.87%20Safari/537.36\thttps://test.com/\tTEST-User-50187\t42134f99b57240d19e05f760800a9dc6\n """

我需要能够将其结构化为如下所示:

array[0] = '2017-02-24'; array[1] = '10:03:39'; array[2] = 'channel_ping';

回答

1

您可以炸掉你的输出:

$arr = explode("\\t",$linesOf); 

或者,如果$ linesOf已经包含了\ T作为一个普通的字符串:

$arr = explode("\t",$linesOf); 

之前,我会做一个子摆脱了“#的版本:2.9 \ n”个部分...

+0

这接近于然而,因为第一线与简化版,'/ t'结束然后我的数组中的第一项是不明确: '0 =>“”” 的#Version:2.9 \ n 2017年2月24日 “”“' 不是: '0 =>‘2017年2月24日’' 我还需要它打破每一新行到一个单独的阵列可能有多个日志每个文件,所有这些都在一个新的行 – user3662307

1

您可以使用正则表达式与preg_match_all

preg_match_all("/\n(\w+?-\w+?-\w+)\t(\w+?:\w+?:\w+)\t([\w_]+)/", $strLog, $matches, PREG_PATTERN_ORDER); 

返回数组:

Array 
(
    [0] => Array 
     (
      [0] => 
2017-02-24 10:03:39 channel_ping 
     ) 

    [1] => Array 
     (
      [0] => 2017-02-24 
     ) 

    [2] => Array 
     (
      [0] => 10:03:39 
     ) 

    [3] => Array 
     (
      [0] => channel_ping 
     ) 
) 

最后,得到的值:

$date = $matches[1][0]; 
$time = $matches[2][0]; 
$command = $matches[3][0]; 
1

您可以使用以下。

使用preg_split,对所有的“空间”拆分字符\s

$res = preg_split('/\s/i',$str); 

然后,因为会有“空字符串”这是没用的是,我们与array_filter对结果进行筛选,以消除那些:

$res = array_filter($res, function($elem) { 
          // if it's not empty after trimming we can use it. 
          if (!empty(trim($elem))){ 
           return true; 
          } 
          return false; 
          }); 

看到它在acion:

http://ideone.com/oE49O9

$str = "#VERSION: 2.9\n 
2017-02-24\t10:03:39\tchannel_ping\t1afcd2e2857". 
"045fe973e7ed036ea450c\tdfe17897d80b44f6901593364fc72b55\t2479884\t127.0.0.1\tM". 
"ozilla/5.0%20(Macintosh;%20Intel%20Mac%20OS%20X%2010_11_6)%20AppleWebKit/537.3". 
"6%20(KHTML,%20like%20Gecko)%20Chrome/56.0.2924.87%20Safari/537.36\thttps://test". 
".com/\tTEST-User-50187\t42134f99b57240d19e05f760800a9dc6\n"; 
$res = preg_split('/\s/i',$str); 
$res = array_filter($res, function($elem) {if(!empty(trim($elem))){return true;}return false; }); 
var_dump($res); 
+0

这很适用,但是如何处理每个文件有多行日志的情况?我需要单独的日志而不是1个数组中的所有日志 – user3662307

+0

首先做一个'preg_split(“/(\ r \ n | \ n | \ r)/”,$ content);'然后用答案中给出的preg split重复这些 – Tschallacka