0

这可能是一些简单的愚蠢的事情,但我自己无法弄清楚。

我正在尝试制作一个移动检测脚本并取得了巨大的成功。但经过更深入的检查,我发现我的一个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 版本不同。

现在我的问题是,在那个用户代理中,字符串位置返回一个匹配ipadAND mobile,我怎样才能让它在第一个字符串匹配后停止?

4

3 回答 3

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];
于 2012-01-15T04:11:00.403 回答
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;
        }
    }
}
于 2012-01-15T03:57:58.667 回答
0

它已经在匹配的第一个字符串处停止$arrAgent;这就是break循环内部正在做的事情。

如果您想优先考虑一场比赛而ipad不是一场比赛mobile,只需重新排列之前出现的$arrAgentso即可。'ipad''mobile'

如果您确保数组的开头是特定术语,末尾是通用术语,您将始终得到最具体的可能匹配项。

于 2012-01-15T04:00:47.920 回答