2012-01-15 31 views
0

這可能是一些簡單的愚蠢的事情,但我無法自己弄清楚。停止在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版本是不同的。

現在我的問題是,在該用戶代理中,字符串位置返回匹配ipad AND mobile,我怎麼能得到它在第一個字符串匹配後停止?

+0

通過「制止」你的意思是讓最左邊的字符串匹配? – mario 2012-01-15 04:00:17

+0

您沒有使用[WURFL](http://wurfl.sourceforge.net/)的任何特定原因? – 2012-01-15 04:03:28

+0

ya,但John Flatness指出,由於我在我的ipad之前有移動這個詞,因此找到第一場比賽後,循環會中斷。 – Eli 2012-01-15 04:03:46

回答

0

將已經停在第一個字符串中$arrAgent匹配;這就是循環內部的break正在做的事情。

如果你想在一個對mobileipad匹配的優先級,只是重新安排你的$arrAgent所以'ipad''mobile'之前出現。

如果確保數組在開始時按照特定術語進行排列,並且在末尾使用通用術語,則始終會返回最具體的可能匹配項。

+0

嗯,我把那裏的休息,因爲這個原因,但geez你的權利!我忘了迭代在這個意義上是愚蠢的哈哈。謝謝! – Eli 2012-01-15 04:02:36

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移動偵測,而是在android和misc移動設備上。所以在這個意義上檢測必須是​​通用的。 – Eli 2012-01-15 04:01:01

+0

我沒有關注你:如果它不是iOS設備,strpos(Server :: userAgent(),'ipad')=== false'將始終爲真,這樣它將循環遍歷數組通常。 – 2012-01-15 04:02:33

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]; 
相關問題