2017-06-08 2 views
0
processLine('23/05/2017 07:10:58 [6] 00-Always: ACTION=QUERY&Text=iphone%205%20has%20no%20network%2A&Summary=Context&SpellCheck=true&QuerySummary=false&Sort=AutnRank%2BRelevance&Synonym=true&TotalResults=true&MaxResults=10&PrintFields=drereference%2Cdretitle%2Ccontenttype%2Cautnrank%2COPTUS%5FFILTER1%2COPTUS%5FFILTER2%2COPTUS%5FFILTER3%2CCANONICAL%5FURL&Start=1&Predict=false&FieldText=%28MATCH%7BMy%20Optus%20Community%7D%3AOPTUS%5FFILTER1%3AOPTUS%5FFILTER2%3AOPTUS%5FFILTER3%20NOT%20MATCH%7Bsmb%7D%3ACONTEXT%20NOT%20MATCH%7BCustom%5FPromotions%7D%3ADREDBNAME%29%2BOR%2B%28%28MATCH%7BCustom%5FPromotions%7D%3ADREDBNAME%29%2BAND%2B%28BIASVAL%7Biphone%205%20has%20no%20network%2A%2C100%7D%3APromotion%5FKeywords%29%2BAND%2B%28MATCH%7Biphone%205%20has%20no%20network%2A%7D%3APromotion%5FKeywords%29%29&Combine=Simple&Characters=250 (127.0.0.1)'); 
if (defined $query && defined $ip && $query =~ m!/?a.*?=(\w+)([?&].*(?<=[?&])Text=([^?&]*))?!) 
{ 
     $events++; 
     my $action = $1; 
     my $terms = uri_unescape($3) || ""; 
} 

Suche in $3iphone%205%20has%20no%20network%2A von Text=iphone%205%20has%20no%20network%2 A und Speicher zu entfernen. Ich habe Regex getestet und finde kein Problem. Es druckt $3 als Kontext.Ausgabe mit Regex in Perl-Skript

Erwartung ist $3 Ausgänge Wert als iphonehasnonetwork

Als ich passieren,

processLine('25/05/2017 14:48:10 [9] 00-Always: action=Query&text=samsung&databasematch=Help_Support&ResponseFormat=json&_=1495687690880 (127.0.0.1)'); 

Er druckt $3 als QuerySamsung. Dies ist das erwartete Ergebnis.

Ich bin neu in Perl, und ich suche diese regex zu ändern und dieses Problem zu lösen. Ich habe bereits mein Perl-Skript entfernt und das Grundproblem diagnostiziert. Diese Regex sieht gut zu mir nach dem Testen einzelner Komponenten von Regex in regex101.com

+1

Warum nicht [CGI] (http://perldoc.perl.org/CGI.html) zu pars e die Abfrageparameter? – tadman

+0

Das Perl wird geschrieben, um Stats vom StatsServer von HPE IDOL zu generieren. Keine Option, aber muss dies tun. – Himan

+2

Wir sprechen hier über Perl. Natürlich gibt es Optionen. – tadman

Antwort

0

Ich bin nicht sicher, was andere Probleme Ihre regex, aber von der Fledermaus Ich sehe: 1) Capture-Gruppen durch die öffnende Klammer nummeriert sind, so dass ich glaube, Sie $ 4 wollen , nicht mehr als $ 3 2) ‚Text‘ könnte später im String ‚FieldText‘ passen

Sie sollten wirklich nur die URI richtig analysieren, indem man alle Argumente (&) Aufspalten und dann die Schlüssel-Wert-Paare (= Splitting)