2017-02-23 47 views
0

大家,我有一個正則表達式的問題在這裏,我要分析此日誌文件,現在我想進去鍵和值的SESSION匹配值

的問題是,這些日誌看起來並不相同,其中一些缺少包含'SESSION'的#字符,但它們都包含單詞SESSION,以便從變量塊開始,然而它們都以另一個總是包含單詞「POST」或「API CURL CALL」。

所以我必須使用量詞最有可能使其在這些字符串,但是當比賽這是一個鍵和值(由:)這兩個其他值的內部分離的任何套...

之間不顧什麼滿口只是談論它...我完全難住,所以我轉向你們在這個問題上的一些指導和幫助。 我們的目標是將這些低劣的日誌解析爲我實際可以快速閱讀並理解的內容。

我在PHP中創建一個類來做到這一點,並吐出一些漂亮的HTML格式的日誌。 這是日誌文件。

[05:40:40] ################ 
[05:40:40] #### SOURCE ####: /zalo/vn/interface.call.php 
[05:40:40] #### REQUEST ####: /zalo/vn/interface.call.php 
[05:40:40] #### Refer: http://app.com/zalo/vn/?v=1&adsid=d6e5f33e5a94d9fafaf15dc0cf4a1e5&sub_id=170100sf01435487523&sub_id1=232s5 
[05:40:40] #### SESSION ##### 
[05:40:40] v: 1 
[05:40:40] adsid: d6e5f33e5a94d93sfsf5dc0cf4a1e5 
[05:40:40] sub_id: 799e12b08fa1edes1d7bgsg0506a6e9 
[05:40:40] landingpage: http%3A%2F%2Fapp.com%2Fzalo%2Fvn%2Finterface.call.php 
[05:40:40] c_id: da21bae82c02d1e2b8168d57cd3fbab7 
[05:40:40] nId: 3943 
[05:40:40] partner: Marvel 
[05:40:40] country_code: 84 
[05:40:40] country: VN 
[05:40:40] url: http://app.com/zalo/vn/ 
[05:40:40] campaign_id: 1066 
[05:40:40] source: web 
[05:40:40] msisdn: 906346534 
[05:40:40] Phone: 906346534 
[05:40:40] #### POST #### 
[05:40:40] action: subscribe 
[05:40:40] Phone: 906346534 
[05:40:40] ################ 
[05:40:40] #### API CURL CALL #### 

理想情況下我還希望保留的這部分

v: 1 
adsid: d6e5f33e5a94d93sfsf5dc0cf4a1e5 
sub_id: 799e12b08fa1edes1d7bgsg0506a6e9 
landingpage: http%3A%2F%2Fapp.com%2Fzalo%2Fvn%2Finterface.call.php 
c_id: da21bae82c02d1e2b8168d57cd3fbab7 
nId: 3943 
partner: Marvel 
country_code: 84 
country: VN 
url: http://app.com/zalo/vn/ 
campaign_id: 1066 
source: web 
msisdn: 906346534 
Phone: 906346534 

我可能需要某種形式的回顧後,先行組合。

(?=SESSION).*?(?<=POST) 

沿着這些線條的東西,但也刪除了我不需要的實際SESSION和POST關鍵字的時間戳。

+0

@michaJlS我已經嘗試了一些不同的事情,我已經看到了網上 '/(<= ## ### SESSION #####)。*?(?= \ [05:40:40 \] #### POST ####)/ si' 看起來像這樣看起來像他們可能工作,但我例如,我不能使用#*,我必須提供一個非常具體的字符串來啓動,這是一個問題,因爲即使我知道字符串將包含SESSION,但我不知道它是否以#開頭,只是SESSION一詞或 - SESSION例如... – JonnySerra

+0

@michaJlS我也包括在內這個問題可能是一個更好的例子。 – JonnySerra

+0

因此,你已經知道如何匹配這些塊,對吧?爲什麼不去除所有不需要的細節和線條? –

回答

1

如果文件不是太大,你可以只通過整個事情循環:

$foo = file("test.txt"); 
$insession = false; 
foreach ($foo as $line) { 
    if (!$insession) { 
     if (strpos($line, "SESSION") === false) continue; 
     $insession = true; 
     continue; 
    } 
    if (strpos($line, "POST") !== false) break; 
    if (preg_match("/^\[[\d:]+?\] (.*)$/", $line, $matches)) { 
     echo "$matches[1]\n"; 
    } 
} 
+0

逐行讀取日誌會提高內存效率 – peter

+0

是的,我假設這是a)一個相當小的文件,b)在HTTP請求期間實時發生。如果其中任何一個都不是真的,那麼有更好的方法來解決這個問題。 – miken32