문제

Requirement : To find out which phone the user is using by parsing the user agent string from his browser.( in PHP ) eg. Nokia 1100 , Samsung D900 .

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

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

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

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

iii) Own solution - I have a small database of phone makers, and models , but will have to add tailormade checks for user agent strings in my code to match /fuzzy match against the database as user agent string format is not consistent across makers.

UPDATE:

We created a tailormade solution which was a mix of regular expressions to parise standard user agents like iOS,Android,Blackberry,and WURFL as a fallback mechanism for other phones like symbian,j2me,bada etc.

WURFL works great after adding database/cache (MySql,memcached,mongodb etc) which already exists as a setting in the core codebase.Though you have to update/sync wurfl information with newest version of WURFL handset xml database every few weeks to stay updated with specs of new released mobile phones.

도움이 되었습니까?

해결책

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

Second, you should consider the parsing time. If you end up using i.e. WURFL and parsing that XML on your site, you would need to parse 400 000+ lines of XML when checking for device information. Of course, you could put the XML into a local indexed database, but that would also require some maintenance scripts to synchronize the data in the updated XML with the database.

Third (but maybe it should be first?) is considering the cost/benefit of the solution. If you make money on the site, it might be smart to leave some responsibility on a partner. A hosting service like handsetdetection.com seems capable of delivering high traffic at a not-so-terrifying cost. Another benefit is that they are responsible for maintaining their own repository and could lose customers if their service isn't good enough. The OpenSource community could theoretically go on a 4 month vacation and the soulution wouldn't be maintained in that period (I really wouldn't think that should be anything to worry about ;-)

Not knowing your exact needs, I would prioritize it like this:

  1. Use as simple a solution as possible, i.e. the solution from Detect Mobile Browsers
  2. Go OpenSource, like WURFL. I just love OpenSource solutions :-)
  3. If your business needs guaranteed stability and data quality, you should let the professionals handle it ;-)

다른 팁

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

}
}
?>

WURFL has been mentioned here a few times already, but you should take a look at the new WURFL Cloud service - it's a hosted version of the WURFL API, maintained by the WURFL team and includes a free plan that may suit your needs.

Here's a quick PHP example of 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.

recently tried to solve a similiar problem, its much better to use an open source or off the shelf solution for this, as you will be in a battle to keep your code upto date etc. personally i'd try the free version, if it does what you need stick with 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 the os, it detects the most popular. then add others as appropriate, for nokia etc.

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

hope this helps.

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

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

If you want more data, first, check if its really necessary, unless you are planning to create a mobile analytics like website, here´s why:

Mobiles can be:

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

  • Tablets, support same as above but witha a larger screen, more
    interface possibilities

  • Medium-end phones, they have access to basic internet, some apps to connect to facebook, twitter etc, but not a fully capable browser

  • Low-end phones, they have a WAP browsers, very slow internet connections

So if you can segregate them in this 4 different groups, that should be enought to your application needs.

Here´s some interesting links, that will help you, to keep it simple, and do what you want to do:

Good luck!

I worked on a content delivery system in the past which implemented WURFL. Seemed OK to me, never had issues!

I use this PHP class in my projects:

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

It works very very well. It's simple, no DB, no remote API, no huge files.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top