首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用分隔符PHP regex匹配块内的值

使用分隔符PHP regex匹配块内的值
EN

Stack Overflow用户
提问于 2017-02-24 04:38:17
回答 1查看 100关注 0票数 0

每个人我这里有一个正则表达式的问题,我想解析这个日志文件,现在我想得到SESSION内部的键和值

问题是,日志看起来并不都一样,其中一些日志缺少#字符包含' SESSION ',但是它们都包含单词SESSION来开始变量块,并且它们都以另一个总是包含单词"POST“或"API CURL CALL”的块结束。

所以我必须使用量词,使它最有可能忽略这些字符串之间的任何东西,但当匹配这两个其他值中的任何键和值集(由:分隔)时…

光是说起这件事就有点扯了.我完全被难住了,所以我在这件事上向你们寻求一些指导和帮助。我们的目标是将这些糟糕的日志解析成我可以快速阅读和理解的东西。

我正在用PHP创建一个类来实现这一点,并输出一些很好的HTML格式的日志。这是原样的日志文件。

代码语言:javascript
复制
[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 ####

理想情况下,我想保留的是这一部分

代码语言:javascript
复制
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 

我可能需要某种后视-前视的组合。

代码语言:javascript
复制
(?=SESSION).*?(?<=POST)

一些类似的东西,但也去掉了我不需要的时间戳、实际的会话和POST关键字。

EN

回答 1

Stack Overflow用户

发布于 2017-02-24 06:12:37

如果文件不是太大,你可以遍历整个文件:

代码语言:javascript
复制
$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";
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42425749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档