2015-04-07 14 views
1

我有一種情況,我需要在日誌中指定組的位置是動態的Web服務器日誌條目上匹配。帶有命名組的可變字段位置的PHP preg_match_all

例如:

日誌1:用戶=麥克&時間=現在&運動=曲棍球&東西

日誌2:時間=現在&運動=曲棍球&用戶=麥克&東西

日誌3:sport =曲棍球& time = now & user = mike & something

爲了我的申請,我需要使用命名組。所有的在線正則表達式測試者都表明下面的方法可以工作,但是PHP返回的數組有點亂。

這裏是我的正則表達式:

(?J)((time=(?<time>.*?))|(name=(?<name>.*?))|(sport=(?<sport>.*?)))\&((time=(?<time>.*?))|(name=(?<name>.*?))|(sport=(?<sport>.*?)))\&(?J)((time=(?<time>.*?))|(name=(?<name>.*?))|(sport=(?<sport>.*?)))\&something* 

由PHP返回的數組是一個爛攤子的事:

array(25) { 
    [0]=> 
    string(41) "name=mike&time=now&sport=hockey&something" 
    [1]=> 
    string(9) "name=mike" 
    [2]=> 
    string(0) "" 
    ["time"]=> 
    string(0) "" 
    [3]=> 
    string(0) "" 
    [4]=> 
    string(9) "name=mike" 
    ["name"]=> 
    string(0) "" 
    [5]=> 
    string(4) "mike" 
    [6]=> 
    string(0) "" 
    ["sport"]=> 
    string(6) "hockey" 
    [7]=> 
    string(0) "" 
    [8]=> 
    string(8) "time=now" 
    [9]=> 
    string(8) "time=now" 
    [10]=> 
    string(3) "now" 
    [11]=> 
    string(0) "" 
    [12]=> 
    string(0) "" 
    [13]=> 
    string(0) "" 
    [14]=> 
    string(0) "" 
    [15]=> 
    string(12) "sport=hockey" 
    [16]=> 
    string(0) "" 
    [17]=> 
    string(0) "" 
    [18]=> 
    string(0) "" 
    [19]=> 
    string(0) "" 
    [20]=> 
    string(12) "sport=hockey" 
    [21]=> 
    string(6) "hockey" 
} 

只有最後一個字段獲取適當的命名組匹配。我嘗試了很多正則表達式的表達式,但總是得到相同的結果:一個亂七八糟的數組。

任何援助或指針表示讚賞。

+1

老實說?我認爲你的正則表達式是混亂的。我會寫一個通用的正則表達式,然後使用'parse_str()'來獲得這些值。 – HamZa

+1

老實說。我有一個解決方案來使用PHP來提取這種情況下的值。問題是這是另一個函數的一部分,它處理來自各種源的其他更簡單的日誌文件條目,並且我試圖找到一個正則表達式來返回正確的值,而不必爲此方案添加異常。從理論上講,我的正則表達式起作用,但PHP返回的數組並不可取。 – dwduck

+1

這裏有一個快速的純正則表達式解決方案https://regex101.com/r/fN2eN6/2,在PHP中,你只需要子數組的時間,名稱和運動。我正在寫一個PHP解決方案,但後來我讀了你的評論......我會發布它:https://eval.in/private/c0bcd3cd8c5e41一定要查看https://regex101.com/r/fN2eN6/3 。去睡覺,希望我幫你。誰知道?我可能會在明天發佈這個答案,或者不會...... :) – HamZa

回答

1

感謝HamZa,該解決方案最終成爲積極的展望而不是有條件的匹配。以下正則表達式正確匹配條件,無論其位置如何。

(?=\S*time=(?<time>[^=&]*))(?=\S*user=(?<name>[^=&]*))(?=\S*sport=(?<sport>[^=&]*))\S+?&something