2012-01-15 1 views
0

Это может быть какая-то простая глупость, но я не могу понять это самостоятельно.остановка в первой строке, сопоставленной с использованием strpos() в PHP

Я пытаюсь создать сценарий обнаружения мобильных устройств и имел большой успех. Но при более глубокой проверке я обнаружил, что один из моих предложений 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 

я получил, что из имитатора IOS, которая поставляется с Xcode, на моем фактическом IPad я видел почти идентичный агент пользователя, только версию операционной системы и сафари версии были разными.

Теперь моя проблема в том, что в этом пользовательском агенте строковая позиция возвращает совпадение для ipad AND mobile, как я могу заставить его остановиться после того, как первая строка будет соответствовать?

+0

By «остановить» вы имеете в виду, чтобы получить самый левый матч строки? – mario

+0

Любая конкретная причина, по которой вы не используете [WURFL] (http://wurfl.sourceforge.net/)? –

+0

ya, но, как указывает Джон Флэнстс, что, поскольку у меня есть термин mobile перед моим ipad, тогда цикл будет ломаться после поиска первого совпадения. – Eli

ответ

0

Он уже остановится на первой строке в $arrAgent, что соответствует; вот что делает break внутри цикла.

Если вы хотите, чтобы расставить приоритеты в матче против ipad по одному против mobile, просто изменить ваш $arrAgent так 'ipad' появляется перед 'mobile'.

Если вы убедитесь, что массив укомплектован определенными терминами в начале и родовыми терминами в конце, вы всегда получите наиболее конкретный возможный ответ.

+0

hmmm, я поставил перерыв там по этой причине, но geez ваше право! Я забыл, что итерация тупо в этом смысле ха-ха. Благодаря! – 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]; 
Смежные вопросы