PHP preg_match_all在具有命名组的变量字段位置上

时间:2015-04-07 22:47:24

标签: php regex

我遇到需要在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"
}

只有最后一个字段在正确的命名组中匹配。我已经尝试了很多正则表达式的演绎,但总是得到相同的结果:一个混乱的数组。

任何帮助或指示表示赞赏。

1 个答案:

答案 0 :(得分:1)

感谢HamZa,解决方案最终成为积极前瞻而不是条件匹配。以下正则表达式与条件无关,无论其位置如何。

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