2017-02-24 102 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