停止在PHP中使用strpos()匹配的第一个字符串

时间:2012-01-15 03:53:39

标签: php strpos

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

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

现在我的问题是,在该用户代理中,字符串位置返回ipadmobile的匹配项,如何在第一个字符串匹配后停止它?

3 个答案:

答案 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正在做的事情。

如果您希望针对ipadmobile的匹配进行优先排序,只需重新排列$arrAgent 'ipad''mobile'之前显示{{1}}。

如果您确保阵列的开头是特定术语,最后是通用术语,那么您将始终获得最具体的匹配回复。