2017-02-23 7 views
0

誰もが、私はキーと値を取得したい今、このログファイルを解析したいですログはすべて同じに見えるわけではなく、「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) 

これらの線に沿って何かが、それはまた、タイムスタンプに私は必要ありません。実際のセッションとPOSTのキーワードを削除します。ファイルには、全部を通してだけでループ可能性が大きすぎないなら

+0

@michaJlS私が見てきたいくつかの異なるものを試してみたオンライン '/(<= ## ## SESSION #####)。*?(?= \ [05:40:40 \] #### POST ####)/ si' 見た目はうまくいくように見えますが、私は文字列に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

ログを1行ずつ読むとメモリー効率が向上します – peter

+0

ええ、これはかなり小さいファイルで、b)HTTPリクエスト中にリアルタイムで発生していると仮定しています。どちらかが真実でない場合、これに対するより良いアプローチがあります。 – miken32