2012-01-15 3 views
0

これはいくつかの単純なばかげたことかもしれませんが、私自身はそれを理解できません。PHPでstrpos()を使用して一致する最初の文字列で停止

私はモバイル検出スクリプトを作成しようとしており、大きな成功を収めています。しかし、より深い点検の結果、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ユーザーエージェント。

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のバージョンとサファリのバージョンをほぼ同じユーザーエージェントを見たことです異なっていた。

私の問題は、そのユーザーエージェントでは、文字列の位置がipadmobileの一致を返したことです。最初の文字列が一致した後にどのように停止するのですか?

+0

を? – mario

+0

[WURFL](http://wurfl.sourceforge.net/)を使用していない特別な理由はありますか? –

+0

yaですが、John Flatnessが指摘しているように、私のipadの前にモバイルという用語があるので、ループは最初のマッチを見つけた後に壊れます。 – Eli

答えて

0

すでに一致し$arrAgentの最初の文字列で停止します。それはループ内のbreakがやっていることです。

あなたはmobileに対して1上ipad戦の優先順位を決定したい場合は、単に'mobile'前に、あなたの$arrAgentので'ipad'が表示されますを並べ替えます。

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

+0

hmmm、私はその理由のためにそこに休憩を入れますが、そういうわけではありません!私はその反復がその意味ではばかげていることを忘れていた。ありがとう! – Eli

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; 
     } 
    } 
} 
+0

私はiOSモバイル検出を行っているのではなく、アンドロイドやその他のモバイルデバイスにも対応しています。その意味での検出は一般的でなければなりません。 – Eli

+0

私はあなたをフォローしていません:iOSデバイスではない場合、 'strpos(Server :: userAgent()、 'ipad')=== false'は常にtrueになります。いつも –

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]; 
関連する問題