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"
}
只有最後一個字段獲取適當的命名組匹配。我嘗試了很多正則表達式的表達式,但總是得到相同的結果:一個亂七八糟的數組。
任何援助或指針表示讚賞。
老實說?我認爲你的正則表達式是混亂的。我會寫一個通用的正則表達式,然後使用'parse_str()'來獲得這些值。 – HamZa
老實說。我有一個解決方案來使用PHP來提取這種情況下的值。問題是這是另一個函數的一部分,它處理來自各種源的其他更簡單的日誌文件條目,並且我試圖找到一個正則表達式來返回正確的值,而不必爲此方案添加異常。從理論上講,我的正則表達式起作用,但PHP返回的數組並不可取。 – dwduck
這裏有一個快速的純正則表達式解決方案https://regex101.com/r/fN2eN6/2,在PHP中,你只需要子數組的時間,名稱和運動。我正在寫一個PHP解決方案,但後來我讀了你的評論......我會發布它:https://eval.in/private/c0bcd3cd8c5e41一定要查看https://regex101.com/r/fN2eN6/3 。去睡覺,希望我幫你。誰知道?我可能會在明天發佈這個答案,或者不會...... :) – HamZa