Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_match_all on带命名组的变量字段位置_Php_Regex - Fatal编程技术网

PHP preg_match_all on带命名组的变量字段位置

PHP preg_match_all on带命名组的变量字段位置,php,regex,Php,Regex,我有一种情况,需要匹配web服务器日志条目,其中命名组的位置在日志中是动态的 例如: 日志1:user=mike&time=now&sport=曲棍球什么的 日志2:time=now&sport=hockey&user=mike&something 日志3:运动=曲棍球&时间=现在&用户=迈克什么的 在我的应用程序中,我需要使用命名组。所有在线正则表达式测试人员都表明下面的方法是有效的,但是PHP中返回的数组有点混乱 这是我的正则表达式: (?J)((time=(?<time>.*?

我有一种情况,需要匹配web服务器日志条目,其中命名组的位置在日志中是动态的

例如:

日志1:user=mike&time=now&sport=曲棍球什么的

日志2:time=now&sport=hockey&user=mike&something

日志3:运动=曲棍球&时间=现在&用户=迈克什么的

在我的应用程序中,我需要使用命名组。所有在线正则表达式测试人员都表明下面的方法是有效的,但是PHP中返回的数组有点混乱

这是我的正则表达式:

(?J)((time=(?<time>.*?))|(name=(?<name>.*?))|(sport=(?<sport>.*?)))\&((time=(?<time>.*?))|(name=(?<name>.*?))|(sport=(?<sport>.*?)))\&(?J)((time=(?<time>.*?))|(name=(?<name>.*?))|(sport=(?<sport>.*?)))\&something*
只有最后一个字段在正确命名的组中匹配。我尝试了许多正则表达式的格式,但总是得到相同的结果:一个混乱的数组


任何帮助或指点都将不胜感激

多亏了哈姆扎,解决方案最终是正面的,而不是有条件的匹配。下面的正则表达式正确地匹配条件,而不考虑其位置

(?=\S*time=(?<time>[^=&]*))(?=\S*user=(?<name>[^=&]*))(?=\S*sport=(?<sport>[^=&]*))\S+?&something
(?=\S*时间=(?[^=&]*)(?=\S*用户=(?[^=&]*)(?=\S*运动=(?[^=&]*))\S+?&什么的

老实说?我觉得你的正则表达式搞砸了。我会编写一个通用正则表达式,然后使用
parse_str()
来获取这些值。在本例中,我有一个使用PHP提取值的解决方案。问题是,这是另一个函数的一部分,该函数处理来自不同来源的其他更简单的日志文件条目,我正试图找到一个正则表达式来返回正确的值,而不必为此场景添加异常。理论上,我的正则表达式可以工作,但是PHP返回的数组并不理想。这里有一个快速的纯正则表达式解决方案,在PHP中,您只需要子数组time、name和sport。我正在写一个php解决方案,但后来我看到了你的评论。。。无论如何我都会把它贴出来:一定要退房。去睡觉吧,希望我能帮你。谁知道呢?我明天可能会将此作为答案发布,或者不发布…:)工作完美。我对lookaheads不够熟悉,但我会的。花点时间调查一下。我能够将您的示例封装在我创建的完整正则表达式中,它工作得非常完美。请将您的解决方案作为答案发布。任何希望使用PCRE解析Microsoft ActiveSync日志的人都将不胜感激!
(?=\S*time=(?<time>[^=&]*))(?=\S*user=(?<name>[^=&]*))(?=\S*sport=(?<sport>[^=&]*))\S+?&something