Parsing a mobile phone user agent string, good solution or library?

Requirement: To find out which phone the user is using by analyzing the user agent string from his browser. (In PHP) for example. Nokia 1100, Samsung D900.

Is there a good library available with a sufficient database of phone manufacturers and models?

Some solutions that I found need your views on the same:

i) handsetdetection : https://www.handsetdetection.com - paid subscription

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

iii) Own decision . I have a small database of phone and model manufacturers, but you will have to add default checks for user agent strings in my code to match / fuzzy match the database as the user agent string format is not consistent between the manufacturers.

UPDATE:

We created a portrait solution that was a combination of regular expressions for analyzing common user agents like iOS, Android, Blackberry and WURFL, as a backup mechanism for other phones like symbian, j2me, bada, etc.

WURFL works fine after adding a database / cache (MySql, memcached, mongodb, etc.), which already exists as a parameter in the base code base. Although you need to update / synchronize wurfl information with the newest version of WURFL for xml mobile phones every few weeks to update with the specifications of the newly released mobile phones.

+7
source share
8 answers

First, I would say that KISS (Keep It Simple, Stupid) is a widely used expression for some reason. I would start by double checking my business needs and see how much information about the device I really need and what I will use for it. Maybe you only need to see which rendering engine the client uses?

Secondly, you must consider the parsing time. If you finish using WURFL and parse this XML site on your site, you will need to parse 400,000+ XML lines when checking the device information. Of course, you could put the XML in a local indexed database, but it would also require several maintenance scripts to synchronize the data in the updated XML with the database.

Thirdly (but maybe this should be the first?) Considers the cost / advantage of the solution. If you make money on the site, it may be wise to leave some responsibility for the partner. A hosting service such as handsetdetection.com seems to be able to provide high traffic at a not-so-terrible price. Another advantage is that they are responsible for maintaining their own repository and may lose customers if their service is insufficient. The OpenSource community can theoretically go on a 4-month vacation, and the soul will not be supported during that period (I really do not think that this should be something to worry about ;-)

Without knowing your specific needs, I would define them like this:

  • Use the simplest solution possible, i.e. Solution from Mobile Browser Detection
  • Go OpenSource like WURFL. I just love OpenSource solutions :-)
  • If your business needs guaranteed stability and data quality, you must let professionals deal with it; -)
+10
source
<?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,.,az,AZ-]/','',$version); } public function getAolVersion() { return $this->_aol_version; } public function setAolVersion($version) { $this->_aol_version = preg_replace('/[^0-9,.,az,AZ]/','',$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\.az]/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][ab]?/i',$this->_agent) && stripos($this->_agent,'netscape') === false) { $aversion = explode(' ',stristr($this->_agent,'rv:')); preg_match('/rv:[0-9].[0-9][ab]?/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; } } } ?> 
+4
source

WURFL has already been mentioned here several times, but you should take a look at the new WURFL Cloud service, a hosted version of the WURFL API supported by the WURFL team, and includes a free plan that can meet your needs.

Here is a quick PHP example using the PHP WURFL cloud client:

 <?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"; } 

Be sure to check out the getting started guide and the WURFL Cloud page .

+2
source

I recently tried to solve a similar problem, it is much better to use it for use with open source code or with a shelf solution, since you will fight to save your code to the end, etc. I personally would try the free version, if it does what you need, stick to it.

you colud try something like 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 ')) {// mobile user}

If you just need to know os, it discovers the most popular. then add others if necessary for nokia etc.

http://www.concrete5.org/community/forums/customizing_c5/mobile-version/ seems to be a more complete list

hope this helps.

0
source

It looks promising, and you can choose which language you need the detection code in: PHP, JS or Apache, Nginx ... but as always you need to test it;) http://detectmobilebrowsers.com

0
source

It is not difficult to implement, check http://detectmobilebrowsers.mobi/#download

If you need more data, first check if it is really necessary if you are not planning to create mobile analytics such as a website, here's why:

Mobile phones can be:

  • Smartphones that handle HTML5 / CSS3 / Javascript, and sometimes even flash

  • tablets , support the same as above, but with a larger screen, more
    interface features

  • Middle-class phones , they have access to the basic Internet, some applications for connecting to facebook, twitter, etc., but not fully capable browser

  • low-maintenance phones , they have WAP browsers, very slow internet connections

So, if you can select them in 4 different groups, this should be enough for your applications.

Here are some interesting links to help you keep it simple and do what you want to do:

Good luck

0
source

In the past, I worked on a content delivery system that implemented WURFL. I felt good, never had a problem!

0
source

I use this PHP class in my projects:

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

It works very well. It is simple, there is no database, no remote API, no huge files.

0
source

All Articles