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