2017-02-23 4 views
0

tout le monde j'ai une question Regex ici, je veux analyser ce fichier journal, maintenant je veux obtenir les clés et les valeurs à l'intérieur de SESSIONvaleurs de match à l'intérieur d'un bloc avec délimiteurs PHP regex

Le problème est que les logs ne se ressemblent pas tous, certains d'entre eux manquent des caractères # entourant la 'SESSION', ils contiennent tous le mot SESSION pour commencer le bloc de variables, et ils se terminent tous par un autre bloc qui contient toujours soit le mots "POST" ou "API CURL CALL".

donc je dois utiliser quantificateurs les plus susceptibles de ne pas tenir compte faire quoi que ce soit entre ces chaînes mais quand correspondance des ensembles de clés et des valeurs (séparées par :) à l'intérieur de ces deux autres valeurs ...

C'est une bouchée juste en parler ... je suis complètement perplexe, alors je me tourne vers vous les gars pour quelques conseils et aide dans cette affaire. Le but est d'analyser ces journaux merdiques en quelque chose que je peux réellement lire rapidement et comprendre.

Je crée une classe en PHP pour le faire et cracher de jolis fichiers HTML formatés. Ceci est le fichier journal tel qu'il se présente.

[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 #### 

Idéalement ce que je veux garder cette section est

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 

J'ai besoin probablement une combinaison de lookbehind-préanalyse de quelque sorte.

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

Quelque chose dans ce sens, mais supprime également les horodatages la SESSION réelle et mots-clés POST que je ne ai pas besoin.

+0

@michaJlS J'ai essayé différentes choses que j'ai vu en ligne '/ (<= ## ## SESSION #####). *? (? = \ [05: 40: 40 \] #### POST ####)/si' Lookbehinds comme ça ressemble à ce qu'ils pourraient fonctionner, mais je Je ne peux pas utiliser # * par exemple, je dois fournir une chaîne très spécifique pour commencer, ce qui est un problème car même si je sais que la chaîne contiendra SESSION, je ne sais pas exactement si elle commence par #, juste le mot SESSION ou - SESSION par exemple ... – JonnySerra

+0

@michaJlS j'ai aussi inclus un exemple peut-être meilleur dans la question. – JonnySerra

+0

Donc, vous savez déjà comment faire correspondre ces blocs, non? Pourquoi ne pas simplement supprimer tous les détails et les lignes dont vous n'avez pas besoin? –

Répondre

1

Si le fichier est pas trop grand, vous pourriez juste boucle à travers la chose:

$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

Lire les journaux ligne par ligne serait plus efficace en termes de mémoire – peter

+0

Oui, je suppose que c'est a) un fichier assez petit, et b) qui se passe en temps réel pendant une requête HTTP. Si l'un ou l'autre n'est pas vrai, il existe de meilleures approches à ce sujet. – miken32