2017-02-23 59 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