Анализ строки агента пользователя мобильного телефона, хорошее решение или библиотека? - PullRequest
7 голосов
/ 01 марта 2012

Требование: Чтобы узнать, какой телефон использует пользователь, проанализировав строку агента пользователя из своего браузера. (В PHP) например. Nokia 1100, Samsung D900.

Существует ли хорошая библиотека с достаточной базой данных продавцов и моделей телефонов?

Некоторые решения, которые я нашел, нуждаются в ваших взглядах на то же:

i) обнаружение трубки : https://www.handsetdetection.com - платная подписка

ii) WURFL - http://wurfl.sourceforge.net/

iii) Собственное решение - У меня есть небольшая база данных производителей телефонов и моделей, но мне придется добавить индивидуальные проверки для строк пользовательского агента в моем коде для сопоставления / нечеткого сопоставления с базой данных как пользователя Формат строки агента не одинаков для разных производителей.

UPDATE:

Мы создали индивидуальное решение, представляющее собой набор регулярных выражений для анализа стандартных пользовательских агентов, таких как iOS, Android, Blackberry и WURFL, в качестве резервного механизма для других телефонов, таких как symbian, j2me, bada и т. Д.

WURFL прекрасно работает после добавления базы данных / кэша (MySql, memcached, mongodb и т. Д.), Который уже существует в качестве параметра в базовой кодовой базе. Поэтому вы должны обновлять / синхронизировать информацию wurfl с новейшей версией базы данных xml-трубки WURFL каждые несколько недель оставаться в курсе спецификаций новых выпущенных мобильных телефонов.

Ответы [ 8 ]

10 голосов
/ 11 марта 2012

Во-первых, я бы сказал, KISS (Keep It Simple, Stupid), что является широко используемым выражением по причине.Я хотел бы начать с двойной проверки своих бизнес-потребностей и посмотреть, сколько информации об устройстве мне действительно нужно и для чего я собираюсь ее использовать.Может быть, вам нужно только посмотреть, какой механизм рендеринга использует клиент?

Во-вторых, вы должны учитывать время разбора.Если вы в конечном итоге используете, например, WURFL и анализируете этот XML на своем сайте, вам потребуется проанализировать 400 000+ строк XML при проверке информации об устройстве.Конечно, вы могли бы поместить XML в локальную индексированную базу данных, но для этого также потребовались бы некоторые сценарии обслуживания для синхронизации данных в обновленном XML с базой данных.

В-третьих (но, может быть, это должно быть первым?)рассматривает стоимость / выгоду решения.Если вы зарабатываете деньги на сайте, было бы разумно оставить некоторую ответственность за партнера.Хостинг, такой как handsetdetection.com , по-видимому, способен обеспечить высокий трафик при не столь ужасной стоимости.Еще одним преимуществом является то, что они несут ответственность за поддержание своего собственного хранилища и могут потерять клиентов, если их сервис недостаточно хорош.Сообщество OpenSource теоретически может отправиться в четырехмесячный отпуск, и в этот период душевное состояние не будет поддерживаться (я действительно не думаю, что стоит о чем-то беспокоиться ;-)

Не зная ваших точных потребностейЯ бы расставил приоритеты следующим образом:

  1. Используйте как можно более простое решение, т.е. решение из Обнаружение мобильных браузеров
  2. Go OpenSource, например WURFL.Я просто обожаю решения OpenSource: -)
  3. Если вашему бизнесу нужна гарантированная стабильность и качество данных, вы должны позволить профессионалам справиться с этим; -)
4 голосов
/ 11 марта 2012
<?php
// Include the browser php file that contains the class
require_once 'Browser1.php';

$browserData = new Browser();
// Output for testing purposes browser info
echo $browserData;
/* My laptop:
Browser Name:Firefox
Browser Version:10.0.2
Browser User Agent String:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Platform:Windows
*/

$browserMajorVersion = intval($browserData->getVersion());
$browserName = $browserData->getBrowser();
$css = 3;
if ($browserName == 'Internet Explorer' || $browserName == 'Opera') $css = 2;
echo '<p>Css version supported:'.$css.'</p>';
// PHP Class file
<?php
class Browser {
private $_agent = '';
private $_browser_name = '';
private $_version = '';
private $_platform = '';
private $_os = '';
private $_is_aol = false;
private $_is_mobile = false;
private $_is_robot = false;
private $_aol_version = '';

const BROWSER_UNKNOWN = 'unknown';
const VERSION_UNKNOWN = 'unknown';

const BROWSER_OPERA = 'Opera';                            // http://www.opera.com/
const BROWSER_OPERA_MINI = 'Opera Mini';                  // http://www.opera.com/mini/
const BROWSER_WEBTV = 'WebTV';                            // http://www.webtv.net/pc/
const BROWSER_IE = 'Internet Explorer';                   // http://www.microsoft.com/ie/
const BROWSER_POCKET_IE = 'Pocket Internet Explorer';     // http://en.wikipedia.org/wiki/Internet_Explorer_Mobile
const BROWSER_KONQUEROR = 'Konqueror';                    // http://www.konqueror.org/
const BROWSER_ICAB = 'iCab';                              // http://www.icab.de/
const BROWSER_OMNIWEB = 'OmniWeb';                        // http://www.omnigroup.com/applications/omniweb/
const BROWSER_FIREBIRD = 'Firebird';                      // http://www.ibphoenix.com/
const BROWSER_FIREFOX = 'Firefox';                        // http://www.mozilla.com/en-US/firefox/firefox.html
const BROWSER_ICEWEASEL = 'Iceweasel';                    // http://www.geticeweasel.org/
const BROWSER_SHIRETOKO = 'Shiretoko';                    // http://wiki.mozilla.org/Projects/shiretoko
const BROWSER_MOZILLA = 'Mozilla';                        // http://www.mozilla.com/en-US/
const BROWSER_AMAYA = 'Amaya';                            // http://www.w3.org/Amaya/
const BROWSER_LYNX = 'Lynx';                              // http://en.wikipedia.org/wiki/Lynx
const BROWSER_SAFARI = 'Safari';                          // http://apple.com
const BROWSER_IPHONE = 'iPhone';                          // http://apple.com
const BROWSER_IPOD = 'iPod';                              // http://apple.com
const BROWSER_IPAD = 'iPad';                              // http://apple.com
const BROWSER_CHROME = 'Chrome';                          // http://www.google.com/chrome
const BROWSER_ANDROID = 'Android';                        // http://www.android.com/
const BROWSER_GOOGLEBOT = 'GoogleBot';                    // http://en.wikipedia.org/wiki/Googlebot
const BROWSER_SLURP = 'Yahoo! Slurp';                     // http://en.wikipedia.org/wiki/Yahoo!_Slurp
const BROWSER_W3CVALIDATOR = 'W3C Validator';             // http://validator.w3.org/
const BROWSER_BLACKBERRY = 'BlackBerry';                  // http://www.blackberry.com/
const BROWSER_ICECAT = 'IceCat';                          // http://en.wikipedia.org/wiki/GNU_IceCat
const BROWSER_NOKIA_S60 = 'Nokia S60 OSS Browser';        // http://en.wikipedia.org/wiki/Web_Browser_for_S60
const BROWSER_NOKIA = 'Nokia Browser';                    // * all other WAP-based browsers on the Nokia Platform
const BROWSER_MSN = 'MSN Browser';                        // http://explorer.msn.com/
const BROWSER_MSNBOT = 'MSN Bot';                         // http://search.msn.com/msnbot.htm
                                                          // http://en.wikipedia.org/wiki/Msnbot  (used for Bing as well)

const BROWSER_NETSCAPE_NAVIGATOR = 'Netscape Navigator';  // http://browser.netscape.com/ (DEPRECATED)
const BROWSER_GALEON = 'Galeon';                          // http://galeon.sourceforge.net/ (DEPRECATED)
const BROWSER_NETPOSITIVE = 'NetPositive';                // http://en.wikipedia.org/wiki/NetPositive (DEPRECATED)
const BROWSER_PHOENIX = 'Phoenix';                        // http://en.wikipedia.org/wiki/History_of_Mozilla_Firefox (DEPRECATED)

const PLATFORM_UNKNOWN = 'unknown';
const PLATFORM_WINDOWS = 'Windows';
const PLATFORM_WINDOWS_CE = 'Windows CE';
const PLATFORM_APPLE = 'Apple';
const PLATFORM_LINUX = 'Linux';
const PLATFORM_OS2 = 'OS/2';
const PLATFORM_BEOS = 'BeOS';
const PLATFORM_IPHONE = 'iPhone';
const PLATFORM_IPOD = 'iPod';
const PLATFORM_IPAD = 'iPad';
const PLATFORM_BLACKBERRY = 'BlackBerry';
const PLATFORM_NOKIA = 'Nokia';
const PLATFORM_FREEBSD = 'FreeBSD';
const PLATFORM_OPENBSD = 'OpenBSD';
const PLATFORM_NETBSD = 'NetBSD';
const PLATFORM_SUNOS = 'SunOS';
const PLATFORM_OPENSOLARIS = 'OpenSolaris';
const PLATFORM_ANDROID = 'Android';

const OPERATING_SYSTEM_UNKNOWN = 'unknown';

public function Browser($useragent="") {
    $this->reset();
    if( $useragent != "" ) {
        $this->setUserAgent($useragent);
    }
    else {
        $this->determine();
    }
}

/**
* Reset all properties
*/
public function reset() {
    $this->_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
    $this->_browser_name = self::BROWSER_UNKNOWN;
    $this->_version = self::VERSION_UNKNOWN;
    $this->_platform = self::PLATFORM_UNKNOWN;
    $this->_os = self::OPERATING_SYSTEM_UNKNOWN;
    $this->_is_aol = false;
    $this->_is_mobile = false;
    $this->_is_robot = false;
    $this->_aol_version = self::VERSION_UNKNOWN;
}

function isBrowser($browserName) { return( 0 == strcasecmp($this->_browser_name, trim($browserName))); }

public function getBrowser() { return $this->_browser_name; }
public function setBrowser($browser) { return $this->_browser_name = $browser; }
public function getPlatform() { return $this->_platform; }
public function setPlatform($platform) { return $this->_platform = $platform; }
public function getVersion() { return $this->_version; }
public function setVersion($version) { $this->_version = preg_replace('/[^0-9,.,a-z,A-Z-]/','',$version); }
public function getAolVersion() { return $this->_aol_version; }
public function setAolVersion($version) { $this->_aol_version = preg_replace('/[^0-9,.,a-z,A-Z]/','',$version); }
public function isAol() { return $this->_is_aol; }
public function isMobile() { return $this->_is_mobile; }
public function isRobot() { return $this->_is_robot; }
public function setAol($isAol) { $this->_is_aol = $isAol; }
protected function setMobile($value=true) { $this->_is_mobile = $value; }
protected function setRobot($value=true) { $this->_is_robot = $value; }
public function getUserAgent() { return $this->_agent; }
public function setUserAgent($agent_string) {
    $this->reset();
    $this->_agent = $agent_string;
    $this->determine();
}
public function isChromeFrame() {
    return( strpos($this->_agent,"chromeframe") !== false );
}
public function __toString() {
    return "<strong>Browser Name:</strong>{$this->getBrowser()}<br/>\n" .
           "<strong>Browser Version:</strong>{$this->getVersion()}<br/>\n" .
           "<strong>Browser User Agent String:</strong>{$this->getUserAgent()}<br/>\n" .
           "<strong>Platform:</strong>{$this->getPlatform()}<br/>";
}
protected function determine() {
    $this->checkPlatform();
    $this->checkBrowsers();
    $this->checkForAol();
}
 protected function checkBrowsers() {
    return (
        $this->checkBrowserWebTv() ||
        $this->checkBrowserInternetExplorer() ||
        $this->checkBrowserOpera() ||
        $this->checkBrowserGaleon() ||
        $this->checkBrowserNetscapeNavigator9Plus() ||
        $this->checkBrowserFirefox() ||
        $this->checkBrowserChrome() ||
        $this->checkBrowserOmniWeb() ||

        // common mobile
        $this->checkBrowserAndroid() ||
        $this->checkBrowseriPad() ||
        $this->checkBrowseriPod() ||
        $this->checkBrowseriPhone() ||
        $this->checkBrowserBlackBerry() ||
        $this->checkBrowserNokia() ||

        // common bots
        $this->checkBrowserGoogleBot() ||
        $this->checkBrowserMSNBot() ||
        $this->checkBrowserSlurp() ||

        // WebKit base check (post mobile and others)
        $this->checkBrowserSafari() ||

        // everyone else
        $this->checkBrowserNetPositive() ||
        $this->checkBrowserFirebird() ||
        $this->checkBrowserKonqueror() ||
        $this->checkBrowserIcab() ||
        $this->checkBrowserPhoenix() ||
        $this->checkBrowserAmaya() ||
        $this->checkBrowserLynx() ||
        $this->checkBrowserShiretoko() ||
        $this->checkBrowserIceCat() ||
        $this->checkBrowserW3CValidator() ||
        $this->checkBrowserMozilla() /* Mozilla is such an open standard that you must check it last */
    );
}
protected function checkBrowserBlackBerry() {
    if( stripos($this->_agent,'blackberry') !== false ) {
        $aresult = explode("/",stristr($this->_agent,"BlackBerry"));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->_browser_name = self::BROWSER_BLACKBERRY;
        $this->setMobile(true);
        return true;
    }
    return false;
}
protected function checkForAol() {
    $this->setAol(false);
    $this->setAolVersion(self::VERSION_UNKNOWN);

    if( stripos($this->_agent,'aol') !== false ) {
        $aversion = explode(' ',stristr($this->_agent, 'AOL'));
        $this->setAol(true);
        $this->setAolVersion(preg_replace('/[^0-9\.a-z]/i', '', $aversion[1]));
        return true;
    }
    return false;
}
protected function checkBrowserGoogleBot() {
    if( stripos($this->_agent,'googlebot') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'googlebot'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion(str_replace(';','',$aversion[0]));
        $this->_browser_name = self::BROWSER_GOOGLEBOT;
        $this->setRobot(true);
        return true;
    }
    return false;
}
protected function checkBrowserMSNBot() {
    if( stripos($this->_agent,"msnbot") !== false ) {
        $aresult = explode("/",stristr($this->_agent,"msnbot"));
        $aversion = explode(" ",$aresult[1]);
        $this->setVersion(str_replace(";","",$aversion[0]));
        $this->_browser_name = self::BROWSER_MSNBOT;
        $this->setRobot(true);
        return true;
    }
    return false;
}
protected function checkBrowserW3CValidator() {
    if( stripos($this->_agent,'W3C-checklink') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'W3C-checklink'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->_browser_name = self::BROWSER_W3CVALIDATOR;
        return true;
    }
    else if( stripos($this->_agent,'W3C_Validator') !== false ) {
        // Some of the Validator versions do not delineate w/ a slash - add it back in
        $ua = str_replace("W3C_Validator ", "W3C_Validator/", $this->_agent);
        $aresult = explode('/',stristr($ua,'W3C_Validator'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->_browser_name = self::BROWSER_W3CVALIDATOR;
        return true;
    }
    return false;
}
protected function checkBrowserSlurp() {
    if( stripos($this->_agent,'slurp') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Slurp'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->_browser_name = self::BROWSER_SLURP;
        $this->setRobot(true);
        $this->setMobile(false);
        return true;
    }
    return false;
}
protected function checkBrowserInternetExplorer() {

    if( stripos($this->_agent,'microsoft internet explorer') !== false ) {
        $this->setBrowser(self::BROWSER_IE);
        $this->setVersion('1.0');
        $aresult = stristr($this->_agent, '/');
        if( preg_match('/308|425|426|474|0b1/i', $aresult) ) {
            $this->setVersion('1.5');
        }
        return true;
    }
    else if( stripos($this->_agent,'msie') !== false && stripos($this->_agent,'opera') === false ) {
        if( stripos($this->_agent,'msnb') !== false ) {
            $aresult = explode(' ',stristr(str_replace(';','; ',$this->_agent),'MSN'));
            $this->setBrowser( self::BROWSER_MSN );
            $this->setVersion(str_replace(array('(',')',';'),'',$aresult[1]));
            return true;
        }
        $aresult = explode(' ',stristr(str_replace(';','; ',$this->_agent),'msie'));
        $this->setBrowser( self::BROWSER_IE );
        $this->setVersion(str_replace(array('(',')',';'),'',$aresult[1]));
        return true;
    }
    else if( stripos($this->_agent,'mspie') !== false || stripos($this->_agent,'pocket') !== false ) {
        $aresult = explode(' ',stristr($this->_agent,'mspie'));
        $this->setPlatform( self::PLATFORM_WINDOWS_CE );
        $this->setBrowser( self::BROWSER_POCKET_IE );
        $this->setMobile(true);

        if( stripos($this->_agent,'mspie') !== false ) {
            $this->setVersion($aresult[1]);
        }
        else {
            $aversion = explode('/',$this->_agent);
            $this->setVersion($aversion[1]);
        }
        return true;
    }
    return false;
}
protected function checkBrowserOpera() {
    if( stripos($this->_agent,'opera mini') !== false ) {
        $resultant = stristr($this->_agent, 'opera mini');
        if( preg_match('/\//',$resultant) ) {
            $aresult = explode('/',$resultant);
            $aversion = explode(' ',$aresult[1]);
            $this->setVersion($aversion[0]);
        }
        else {
            $aversion = explode(' ',stristr($resultant,'opera mini'));
            $this->setVersion($aversion[1]);
        }
        $this->_browser_name = self::BROWSER_OPERA_MINI;
        $this->setMobile(true);
        return true;
    }
    else if( stripos($this->_agent,'opera') !== false ) {
        $resultant = stristr($this->_agent, 'opera');
        if( preg_match('/Version\/(11.*)$/',$resultant,$matches) ) {
            $this->setVersion($matches[1]);
        }
        else if( preg_match('/Version\/(10.*)$/',$resultant,$matches) ) {
            $this->setVersion($matches[1]);
        }
        else if( preg_match('/\//',$resultant) ) {
            $aresult = explode('/',str_replace("("," ",$resultant));
            $aversion = explode(' ',$aresult[1]);
            $this->setVersion($aversion[0]);
        }
        else {
            $aversion = explode(' ',stristr($resultant,'opera'));
            $this->setVersion(isset($aversion[1])?$aversion[1]:"");
        }
        $this->_browser_name = self::BROWSER_OPERA;
        return true;
    }
    return false;
}
protected function checkBrowserChrome() {
    if( stripos($this->_agent,'Chrome') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Chrome'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->setBrowser(self::BROWSER_CHROME);
        return true;
    }
    return false;
}
protected function checkBrowserWebTv() {
    if( stripos($this->_agent,'webtv') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'webtv'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->setBrowser(self::BROWSER_WEBTV);
        return true;
    }
    return false;
}
protected function checkBrowserNetPositive() {
    if( stripos($this->_agent,'NetPositive') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'NetPositive'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion(str_replace(array('(',')',';'),'',$aversion[0]));
        $this->setBrowser(self::BROWSER_NETPOSITIVE);
        return true;
    }
    return false;
}
protected function checkBrowserGaleon() {
    if( stripos($this->_agent,'galeon') !== false ) {
        $aresult = explode(' ',stristr($this->_agent,'galeon'));
        $aversion = explode('/',$aresult[0]);
        $this->setVersion($aversion[1]);
        $this->setBrowser(self::BROWSER_GALEON);
        return true;
    }
    return false;
}
protected function checkBrowserKonqueror() {
    if( stripos($this->_agent,'Konqueror') !== false ) {
        $aresult = explode(' ',stristr($this->_agent,'Konqueror'));
        $aversion = explode('/',$aresult[0]);
        $this->setVersion($aversion[1]);
        $this->setBrowser(self::BROWSER_KONQUEROR);
        return true;
    }
    return false;
}
protected function checkBrowserIcab() {
    if( stripos($this->_agent,'icab') !== false ) {
        $aversion = explode(' ',stristr(str_replace('/',' ',$this->_agent),'icab'));
        $this->setVersion($aversion[1]);
        $this->setBrowser(self::BROWSER_ICAB);
        return true;
    }
    return false;
}
protected function checkBrowserOmniWeb() {
    if( stripos($this->_agent,'omniweb') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'omniweb'));
        $aversion = explode(' ',isset($aresult[1])?$aresult[1]:"");
        $this->setVersion($aversion[0]);
        $this->setBrowser(self::BROWSER_OMNIWEB);
        return true;
    }
    return false;
}
protected function checkBrowserPhoenix() {
    if( stripos($this->_agent,'Phoenix') !== false ) {
        $aversion = explode('/',stristr($this->_agent,'Phoenix'));
        $this->setVersion($aversion[1]);
        $this->setBrowser(self::BROWSER_PHOENIX);
        return true;
    }
    return false;
}
protected function checkBrowserFirebird() {
    if( stripos($this->_agent,'Firebird') !== false ) {
        $aversion = explode('/',stristr($this->_agent,'Firebird'));
        $this->setVersion($aversion[1]);
        $this->setBrowser(self::BROWSER_FIREBIRD);
        return true;
    }
    return false;
}
protected function checkBrowserNetscapeNavigator9Plus() {
    if( stripos($this->_agent,'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i',$this->_agent,$matches) ) {
        $this->setVersion($matches[1]);
        $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
        return true;
    }
    else if( stripos($this->_agent,'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i',$this->_agent,$matches) ) {
        $this->setVersion($matches[1]);
        $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
        return true;
    }
    return false;
}
protected function checkBrowserShiretoko() {
    if( stripos($this->_agent,'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i',$this->_agent,$matches) ) {
        $this->setVersion($matches[1]);
        $this->setBrowser(self::BROWSER_SHIRETOKO);
        return true;
    }
    return false;
}
protected function checkBrowserIceCat() {
    if( stripos($this->_agent,'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i',$this->_agent,$matches) ) {
        $this->setVersion($matches[1]);
        $this->setBrowser(self::BROWSER_ICECAT);
        return true;
    }
    return false;
}
protected function checkBrowserNokia() {
    if( preg_match("/Nokia([^\/]+)\/([^ SP]+)/i",$this->_agent,$matches) ) {
        $this->setVersion($matches[2]);
        if( stripos($this->_agent,'Series60') !== false || strpos($this->_agent,'S60') !== false ) {
            $this->setBrowser(self::BROWSER_NOKIA_S60);
        }
        else {
            $this->setBrowser( self::BROWSER_NOKIA );
        }
        $this->setMobile(true);
        return true;
    }
    return false;
}
protected function checkBrowserFirefox() {
    if( stripos($this->_agent,'safari') === false ) {
        if( preg_match("/Firefox[\/ \(]([^ ;\)]+)/i",$this->_agent,$matches) ) {
            $this->setVersion($matches[1]);
            $this->setBrowser(self::BROWSER_FIREFOX);
            return true;
        }
        else if( preg_match("/Firefox$/i",$this->_agent,$matches) ) {
            $this->setVersion("");
            $this->setBrowser(self::BROWSER_FIREFOX);
            return true;
        }
    }
    return false;
}
protected function checkBrowserIceweasel() {
    if( stripos($this->_agent,'Iceweasel') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Iceweasel'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->setBrowser(self::BROWSER_ICEWEASEL);
        return true;
    }
    return false;
}
protected function checkBrowserMozilla() {
    if( stripos($this->_agent,'mozilla') !== false  && preg_match('/rv:[0-9].[0-9][a-b]?/i',$this->_agent) && stripos($this->_agent,'netscape') === false) {
        $aversion = explode(' ',stristr($this->_agent,'rv:'));
        preg_match('/rv:[0-9].[0-9][a-b]?/i',$this->_agent,$aversion);
        $this->setVersion(str_replace('rv:','',$aversion[0]));
        $this->setBrowser(self::BROWSER_MOZILLA);
        return true;
    }
    else if( stripos($this->_agent,'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i',$this->_agent) && stripos($this->_agent,'netscape') === false ) {
        $aversion = explode('',stristr($this->_agent,'rv:'));
        $this->setVersion(str_replace('rv:','',$aversion[0]));
        $this->setBrowser(self::BROWSER_MOZILLA);
        return true;
    }
    else if( stripos($this->_agent,'mozilla') !== false  && preg_match('/mozilla\/([^ ]*)/i',$this->_agent,$matches) && stripos($this->_agent,'netscape') === false ) {
        $this->setVersion($matches[1]);
        $this->setBrowser(self::BROWSER_MOZILLA);
        return true;
    }
    return false;
}
protected function checkBrowserLynx() {
    if( stripos($this->_agent,'lynx') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Lynx'));
        $aversion = explode(' ',(isset($aresult[1])?$aresult[1]:""));
        $this->setVersion($aversion[0]);
        $this->setBrowser(self::BROWSER_LYNX);
        return true;
    }
    return false;
}
protected function checkBrowserAmaya() {
    if( stripos($this->_agent,'amaya') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Amaya'));
        $aversion = explode(' ',$aresult[1]);
        $this->setVersion($aversion[0]);
        $this->setBrowser(self::BROWSER_AMAYA);
        return true;
    }
    return false;
}

protected function checkBrowserSafari() {
    if( stripos($this->_agent,'Safari') !== false && stripos($this->_agent,'iPhone') === false && stripos($this->_agent,'iPod') === false ) {
        $aresult = explode('/',stristr($this->_agent,'Version'));
        if( isset($aresult[1]) ) {
            $aversion = explode(' ',$aresult[1]);
            $this->setVersion($aversion[0]);
        }
        else {
            $this->setVersion(self::VERSION_UNKNOWN);
        }
        $this->setBrowser(self::BROWSER_SAFARI);
        return true;
    }
    return false;
}

protected function checkBrowseriPhone() {
    if( stripos($this->_agent,'iPhone') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Version'));
        if( isset($aresult[1]) ) {
            $aversion = explode(' ',$aresult[1]);
            $this->setVersion($aversion[0]);
        }
        else {
            $this->setVersion(self::VERSION_UNKNOWN);
        }
        $this->setMobile(true);
        $this->setBrowser(self::BROWSER_IPHONE);
        return true;
    }
    return false;
}
protected function checkBrowseriPad() {
    if( stripos($this->_agent,'iPad') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Version'));
        if( isset($aresult[1]) ) {
            $aversion = explode(' ',$aresult[1]);
            $this->setVersion($aversion[0]);
        }
        else {
            $this->setVersion(self::VERSION_UNKNOWN);
        }
        $this->setMobile(true);
        $this->setBrowser(self::BROWSER_IPAD);
        return true;
    }
    return false;
}
protected function checkBrowseriPod() {
    if( stripos($this->_agent,'iPod') !== false ) {
        $aresult = explode('/',stristr($this->_agent,'Version'));
        if( isset($aresult[1]) ) {
            $aversion = explode(' ',$aresult[1]);
            $this->setVersion($aversion[0]);
        }
        else {
            $this->setVersion(self::VERSION_UNKNOWN);
        }
        $this->setMobile(true);
        $this->setBrowser(self::BROWSER_IPOD);
        return true;
    }
    return false;
}

protected function checkBrowserAndroid() {
    if( stripos($this->_agent,'Android') !== false ) {
        $aresult = explode(' ',stristr($this->_agent,'Android'));
        if( isset($aresult[1]) ) {
            $aversion = explode(' ',$aresult[1]);
            $this->setVersion($aversion[0]);
        }
        else {
            $this->setVersion(self::VERSION_UNKNOWN);
        }
        $this->setMobile(true);
        $this->setBrowser(self::BROWSER_ANDROID);
        return true;
    }
    return false;
}
protected function checkPlatform() {
    if( stripos($this->_agent, 'windows') !== false ) {
        $this->_platform = self::PLATFORM_WINDOWS;
    }
    else if( stripos($this->_agent, 'iPad') !== false ) {
        $this->_platform = self::PLATFORM_IPAD;
    }
    else if( stripos($this->_agent, 'iPod') !== false ) {
        $this->_platform = self::PLATFORM_IPOD;
    }
    else if( stripos($this->_agent, 'iPhone') !== false ) {
        $this->_platform = self::PLATFORM_IPHONE;
    }
    elseif( stripos($this->_agent, 'mac') !== false ) {
        $this->_platform = self::PLATFORM_APPLE;
    }
    elseif( stripos($this->_agent, 'android') !== false ) {
        $this->_platform = self::PLATFORM_ANDROID;
    }
    elseif( stripos($this->_agent, 'linux') !== false ) {
        $this->_platform = self::PLATFORM_LINUX;
    }
    else if( stripos($this->_agent, 'Nokia') !== false ) {
        $this->_platform = self::PLATFORM_NOKIA;
    }
    else if( stripos($this->_agent, 'BlackBerry') !== false ) {
        $this->_platform = self::PLATFORM_BLACKBERRY;
    }
    elseif( stripos($this->_agent,'FreeBSD') !== false ) {
        $this->_platform = self::PLATFORM_FREEBSD;
    }
    elseif( stripos($this->_agent,'OpenBSD') !== false ) {
        $this->_platform = self::PLATFORM_OPENBSD;
    }
    elseif( stripos($this->_agent,'NetBSD') !== false ) {
        $this->_platform = self::PLATFORM_NETBSD;
    }
    elseif( stripos($this->_agent, 'OpenSolaris') !== false ) {
        $this->_platform = self::PLATFORM_OPENSOLARIS;
    }
    elseif( stripos($this->_agent, 'SunOS') !== false ) {
        $this->_platform = self::PLATFORM_SUNOS;
    }
    elseif( stripos($this->_agent, 'OS\/2') !== false ) {
        $this->_platform = self::PLATFORM_OS2;
    }
    elseif( stripos($this->_agent, 'BeOS') !== false ) {
        $this->_platform = self::PLATFORM_BEOS;
    }
    elseif( stripos($this->_agent, 'win') !== false ) {
        $this->_platform = self::PLATFORM_WINDOWS;
    }

}
}
?>
2 голосов
/ 13 марта 2012

WURFL уже упоминался здесь несколько раз, но вы должны взглянуть на новую облачную службу WURFL - это размещенная версия WURFL API, поддерживаемая командой WURFL и включающая бесплатный план, который может удовлетворить ваши потребности.

Вот краткий пример использования PHP облачного клиента PHP WURFL:

<?php
require_once '../Client/Client.php';
$config = new WurflCloud_Client_Config();  
$config->api_key = 'xxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';   
$client = new WurflCloud_Client_Client($config);  
$client->detectDevice();
$brand = $client->getDeviceCapability('brand_name');
$model = $client->getDeviceCapability('model_name');
if ($client->getDeviceCapability('ux_full_desktop')) {  
    echo "This is a desktop web browser";  
} else {  
    echo "This is a $brand $model";
}

Обязательно ознакомьтесь с руководством по началу работы и WURFLОблачная страница .

0 голосов
/ 13 марта 2012

Я использую этот класс PHP в своих проектах:

http://code.google.com/p/mobileesp/source/browse/PHP/mdetect.php

Работает очень и очень хорошо. Все просто, нет БД, нет удаленного API, нет огромных файлов.

0 голосов
/ 12 марта 2012

В прошлом я работал над системой доставки контента, которая реализовывала WURFL. Казалось, хорошо для меня, никогда не было проблем!

0 голосов
/ 12 марта 2012

Это не сложно реализовать, отметьте http://detectmobilebrowsers.mobi/#download

Если вы хотите больше данных, сначала проверьте, действительно ли это необходимо, если только вы не планируете создавать мобильную аналитику, такую ​​как веб-сайт, вот почему:

Мобильные телефоны могут быть:

  • Смартфоны , которые обрабатывают HTML5 / CSS3 / Javascript и иногда даже мигают

  • Планшеты , поддержка та же, что и выше, но с большим экраном, больше возможностей интерфейса

  • Телефоны среднего класса они имеют доступ к основному Интернету, некоторые приложения для подключения к Facebook, Twitter и т. д., но не полностью совместимый браузер

  • бюджетные телефоны , у них естьWAP-браузеры, очень медленные интернет-соединения

Так что, если вы можете разделить их в этих 4 различных группах, это должно быть достаточно для ваших приложений.

Вот несколько интересных ссылок, которые помогут вам сохранить простоту и делать то, что вы хотите сделать:

Удачи!

0 голосов
/ 08 марта 2012

Это выглядит многообещающе, и вы можете выбрать, на каком языке вы хотите код обнаружения: PHP, JS или Apache, Nginx ... но, как всегда, вам нужно его проверить;) http://detectmobilebrowsers.com

0 голосов
/ 08 марта 2012

недавно пытался решить похожую проблему, для этого гораздо лучше использовать с открытым исходным кодом или готовое решение, так как вы будете в битве за обновление вашего кода и т. Д. Лично я бы попробовал бесплатную версию, если он делает то, что вам нужно, придерживайтесь его.

вы можете попробовать что-то вроде if (strstr ($ _ SERVER ['HTTP_USER_AGENT'], 'Android') || strstr ($ _ SERVER ['HTTP_USER_AGENT'], 'webOS') || strstr ($ _ SERVER ['HTTP_USER_AGENT'], 'iPhone') || strstr ($ _ SERVER ['HTTP_USER_AGENT'], 'iPod')) {// мобильный пользователь}

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

http://www.concrete5.org/community/forums/customizing_c5/mobile-version/ представляется более полным списком

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...