2017-06-08 21 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) || ""; 
} 

我期待剝去Text=iphone%205%20has%20no%20network%2一個iphone%205%20has%20no%20network%2A,並存儲在$3。我測試了正則表達式,似乎沒有發現問題。它將$3作爲上下文打印。問題與perl腳本的正則表達式

期望是$3輸出值作爲iphonehasnonetwork

當我傳球,

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

它打印$3作爲QuerySamsung。這是預期的結果。

我是新來的Perl,我期待修改這個正則表達式,並排除這個問題。我已經剝離了我的perl腳本,並且診斷出根本問題。

$query =~ m!/?a.*?=(\w+)([?&].*(?<=[?&])Text=([^?&]*))?!i 

看到i到底:這正則表達式中regex101.com

+1

爲什麼不使用[CGI](http://perldoc.perl.org/CGI.html)來解析e查詢參數? – tadman

+0

編寫perl是爲了從HPE IDOL的StatsServer生成統計信息。沒有選擇,但必須這樣做。 – Himan

+2

我們在這裏討論Perl。當然有選擇。 – tadman

回答

0

我不知道你的正則表達式有什麼其他的問題,但蝙蝠我看到: 1)捕獲組由左括號編號的,所以我想你想$ 4 ,而不是$ 3 2)「文本」可能在後面的字符串

你真的應該正確地分割的所有參數(&),然後拆分鍵值對(=只是解析URI匹配「FieldText」)