这可能是一些简单的愚蠢的事情,但我无法自己弄清楚。
我正在尝试制作移动检测脚本并取得了巨大成功。但经过深入检查,我发现我的IF
条款之一似乎正在返回TRUE
,但错误匹配。
我有这个数组:
private $arrAgent = array(
'sony',
'symbian',
'nokia',
'samsung',
'mobile',
'windows ce',
'blackberry',
'ericsson',
'danger',
'palm',
'series60',
'palmsource',
'pocketpc',
'smartphone',
'vodafone',
'iphone',
'ipad',
'android'
);
然后我有一个函数将循环数组并找到它是否匹配
private function detectMobileAgent() {
if ($this->MobileDevice === false) {
foreach ($this->arrAgent as $key => $value) {
if (strpos(Server::userAgent(), $value) !== false) {
$this->MobileDevice = true;
// echo $value;
break;
}
}
}
}
现在问题是我在iPad / iPhone userAgent中发现了一个错误,导致我无法获得清晰的阅读。
iPad用户代理如下所示:
mozilla/5.0 (ipad; u; cpu os 4_3_2 like mac os x; en-us) applewebkit/533.17.9 (khtml, like gecko) version/5.0.2 mobile/8h7 safari/6533.18.5
我从xCode附带的iOS模拟器那里得到了这个,在我的实际iPad上我看到了几乎相同的用户代理,只是操作系统版本和Safari版本不同。
现在我的问题是,在该用户代理中,字符串位置返回ipad
和mobile
的匹配项,如何在第一个字符串匹配后停止它?
答案 0 :(得分:2)
我已经做了很多实验,我尝试的所有技术的最佳方法是使用正则表达式:
$arrAgent = array(
'sony',
'symbian',
'nokia',
'samsung',
'mobile',
'windows ce',
'blackberry',
'ericsson',
'danger',
'palm',
'series60',
'palmsource',
'pocketpc',
'smartphone',
'vodafone',
'iphone',
'android',
'ipad'
);
$agent = 'mozilla/5.0 (ipad; u; cpu os 4_3_2 like mac os x; en-us) applewebkit/533.17.9 (khtml, like gecko) version/5.0.2 mobile/8h7 safari/6533.18.5';
$pattern = '/((' . implode(')|(', $arrAgent) . '))/';
$found = preg_match($pattern, $agent, $matches);
if (!$found) {
print 'not a mobile device';
exit;
}
print 'device: ' . $matches[0];
答案 1 :(得分:0)
为什么不首先检查它是否是iPad?
这样的事情:
if ($this->MobileDevice === false && strpos(Server::userAgent(), 'ipad') === false) {
foreach ($this->arrAgent as $key => $value) {
if (strpos(Server::userAgent(), $value) !== false) {
$this->MobileDevice = true;
// echo $value;
break;
}
}
}
答案 2 :(得分:0)
它已经停在匹配的$arrAgent
中的第一个字符串;这就是循环中break
正在做的事情。
如果您希望针对ipad
对mobile
的匹配进行优先排序,只需重新排列$arrAgent
'ipad'
,'mobile'
之前显示{{1}}。
如果您确保阵列的开头是特定术语,最后是通用术语,那么您将始终获得最具体的匹配回复。