我遇到需要在Web服务器日志条目上匹配的情况,其中命名组的位置在日志中是动态的。
例如:
记录1:user = mike& time = now& sport = hockey& something
记录2:time = now& sport = hockey& user = mike& something
记录3:sport = hockey& 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"
}
只有最后一个字段在正确的命名组中匹配。我已经尝试了很多正则表达式的演绎,但总是得到相同的结果:一个混乱的数组。
任何帮助或指示表示赞赏。
答案 0 :(得分:1)
感谢HamZa,解决方案最终成为积极前瞻而不是条件匹配。以下正则表达式与条件无关,无论其位置如何。
(?=\S*time=(?<time>[^=&]*))(?=\S*user=(?<name>[^=&]*))(?=\S*sport=(?<sport>[^=&]*))\S+?&something