0

これは単純なばかげたことかもしれませんが、私はそれを自分で理解することはできません。

私はモバイル検出スクリプトを作成しようとしていますが、大きな成功を収めています。しかし、詳しく調べてみると、私のIF句の1つが戻ってきているように見えます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では、ほぼ同じユーザーエージェントが表示され、OSバージョンと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に対して1つよりも一致を優先したい場合は、の前に表示されるようmobileに並べ替えるだけです。$arrAgent'ipad''mobile'

配列が最初に特定の用語で、最後に一般的な用語で配置されていることを確認すると、常に最も具体的な一致が返されます。

于 2012-01-15T04:00:47.920 に答える