正则匹配仅返回最后匹配值:如何优先获取Windows Phone识别结果
解决User-Agent正则匹配时优先返回指定操作系统的问题
问题场景
当传入的User-Agent同时包含Windows Phone和Android标识时:
Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; SAMSUNG; GT-I8750) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Mobile Safari/537.36 Edge/15.15063
当前代码会返回最后匹配到的Android,但实际需求是优先返回Windows Phone 10.0。
问题原因
你的foreach循环会遍历所有正则规则,每次匹配成功都会覆盖$os_platform变量,后匹配到的规则结果会覆盖之前的,导致预设的优先级逻辑失效。
解决方案
一旦找到匹配的规则,立即返回对应的结果,终止后续循环,这样排在数组前面的规则就会拥有最高优先级。同时调整返回值,让它完全符合你的期望输出:
修改后的PHP代码:
function getOS() { global $user_agent; $os_platform = "Unknown OS Platform"; $os_array = array( '/Windows Phone 10.0/i' => 'Windows Phone 10.0', // 调整返回值匹配期望输出 '/android/i' => 'Android', ); foreach ($os_array as $regex => $value) { if (preg_match($regex, $user_agent)) { return $value; // 匹配成功直接返回,终止后续循环 } } return $os_platform; }
关键说明
- 遍历规则时,第一个匹配成功的规则会直接返回对应值,后续规则不再执行,保证了Windows Phone规则的优先级
- 将原返回值
Windows Phone 10调整为Windows Phone 10.0,让输出完全匹配需求
内容的提问来源于stack exchange,提问作者GawiSh
相关产品推荐
相关产品推荐

