array( 'name' => $browser_name , 'code' => $browser_code , 'version' => $browser_ver , ), 'os' => array( 'name' => $os_name , 'code' => $os_code , 'version' => $os_ver , ), 'pda' => array( 'name' => $pda_name , 'code' => $pda_code , 'version' => $pda_ver , ), ); } static private function _os($ua) { $os_name = $os_code = $os_ver = $pda_name = $pda_code = $pda_ver = null; list($os_name, $os_code, $os_ver) = (preg_match('/win(dows)?/i', $ua) ? self::_os_win($ua) : self::_os_unix($ua) ); // Windows CE if ( $os_code == "windows" && ( $os_ver == "CE" || empty($os_ver) ) ) list($pda_name, $pda_code, $pda_ver) = self::_pda($ua); // Windows Phone if ( $os_code == "windows_phone" ) list($pda_name, $pda_code, $pda_ver) = self::_pda($ua); return array($os_name, $os_code, $os_ver, $pda_name, $pda_code, $pda_ver); } static private function _os_win($ua) { $os_name = $os_code = $os_ver = null; if (preg_match('/mac_powerpc/i', $ua)) { $os_name = "Mac OS"; $os_code = "macos"; } else if (preg_match('/win(dows)?[ \.]?(9[58]|9x 4\.90|[cm]e|2000|nt ?[456]\.0|nt ?5\.[12])/i', $ua, $matches)) { $os_name = "Windows"; $os_code = "windows"; $os_ver = strtoupper(trim($matches[2])); switch ($os_ver) { case '95': $os_ver = "95"; break; case '9X 4.90'; case 'ME'; $os_ver = "ME"; break; case 'NT4.0'; case 'NT 4.0'; $os_ver = "NT 4.0"; break; case '2000': case 'NT 5.0': $os_ver = "2000"; break; case 'NT 5.1': $os_ver = "XP"; break; case 'NT 5.2': $os_ver = ( preg_match('/(win|wow)64/i', $ua) ? "XP (64bit)" : "Server 2003" ); break; case 'NT 6.0': $os_ver = "Vista" . ( preg_match('/(win|wow)64/i', $ua) ? " (64bit)" : "" ); break; case 'NT 6.1': $os_ver = "7" . ( preg_match('/(win|wow)64/i', $ua) ? " (64bit)" : "" ); break; case 'CE'; $os_name = "Windows"; $os_code = "windows"; $os_ver = "CE"; if (preg_match('/ppc/i', $ua)) { $os_name = "Microsoft PocketPC"; $os_code = "windows"; $os_ver = ''; } if (preg_match('/smartphone/i', $ua)) { $os_name = "Microsoft Smartphone"; $os_code = "windows"; $os_ver = ''; } break; } } else if (preg_match('/win(dows)? phone os ([0-9\.]+)/i', $ua, $matches)) { $os_name = "Windows Phone"; $os_code = "windows_phone"; $os_ver = strtoupper(trim($matches[2])); } else if (preg_match('/win(dows )?nt/i', $ua)) { $os_name = "Windows"; $os_code = "windows"; $os_ver = "NT"; } return array($os_name, $os_code, $os_ver); } static private function _os_unix($ua) { $os_name = $os_code = $os_ver = null; if (preg_match('/linux/i', $ua)) { $os_name = "Linux"; $os_code = "linux"; if (preg_match('/(android|debian|mandrake|suse|novell|ubuntu|red ?hat|gentoo|fedora|mepis|knoppix|slackware|xandros|kanotix)/i', $ua, $matches)) { $os_code = strtolower(trim($matches[1])); switch ($os_code) { case 'android': $os_name = "Android"; $os_code = "android"; break; case 'debian': $os_name = "Debian GNU/Linux"; $os_code = "debian"; break; case 'mandrake': $os_name = "Mandrake Linux"; $os_code = "mandrake"; break; case 'suse': $os_name = "SuSE Linux"; $os_code = "suse"; break; case 'novell': $os_name = "Novell Linux"; $os_code = "novell"; break; case 'ubuntu': $os_name = "Ubuntu Linux"; $os_code = "ubuntu"; break; case 'redhat': case 'red hat': $os_name = "RedHat Linux"; $os_code = "redhat"; break; case 'gentoo': $os_name = "Gentoo Linux"; $os_code = "gentoo"; break; case 'fedora': $os_name = "Fedora Linux"; $os_code = "fedora"; break; case 'mepis': $os_name = "MEPIS Linux"; $os_code = "linux"; break; case 'knoppix': $os_name = "Knoppix Linux"; $os_code = "linux"; break; case 'slackware': $os_name = "Slackware Linux"; $os_code = "slackware"; break; case 'xandros': $os_name = "Xandros Linux"; $os_code = "linux"; break; case 'kanotix': $os_name = "Kanotix Linux"; $os_code = "linux"; break; } } } else if (preg_match('/((free|net|open)bsd|irix|sunos|mac( os x|intosh|_powerpc))/i', $ua, $matches)) { $os_name = trim($matches[1]); $os_code = strtolower($os_name); switch ($os_code) { case 'freebsd': $os_name = "FreeBSD"; $os_code = "freebsd"; break; case 'netbsd': $os_name = "NetBSD"; $os_code = "netbsd"; break; case 'openbsd': $os_name = "OpenBSD"; $os_code = "openbsd"; break; case 'irix': $os_name = "SGI IRIX"; $os_code = "sgi"; break; case 'sunos': $os_name = "Solaris"; $os_code = "sun"; break; case 'mac os x': $os_name = "Mac OS"; $os_code = "macos"; $os_ver = "X"; break; case 'macintosh': case 'mac_powerpc': $os_name = "Mac OS"; $os_code = "macos"; break; } } else if (preg_match('/unix/i', $ua)) { $os_name = "UNIX"; $os_code = "unix"; } return array($os_name, $os_code, $os_ver); } static private function _os_mac($ua) { $os_name = $os_code = $os_ver = null; if (preg_match('/(mac( os x|intosh|_powerpc))/i', $ua, $matches)) { $os_name = trim($matches[1]); $os_code = strtolower($os_name); switch ($os_code) { case 'mac os x': $os_name = "Mac OS"; $os_code = "macos"; $os_ver = "X"; break; case 'macintosh': case 'mac_powerpc': $os_name = "Mac OS"; $os_code = "macos"; break; } } return array($os_name, $os_code, $os_ver); } static private function _os_pda($ua) { $os_name = $os_code = $os_ver = $pda_name = $pda_code = $pda_ver = null; if (preg_match('/(palmos|windows ce|windows phone|qtembedded|zaurus|symbian)/i', $ua, $matches)) { $os_name = $matches[1]; $os_code = strtolower($os_name); switch ($os_code) { case 'palmos': $os_name = "Palm OS"; $os_code = "palm"; break; case 'windows ce': $os_name = "Windows CE"; $os_code = "windows"; break; case 'windows phone': $os_name = "Windows Phone"; $os_code = "windows"; break; case 'qtembedded': $os_name = "Qtopia"; $os_code = "linux"; break; case 'zaurus': $os_name = "Zaurus"; $os_code = "linux"; break; case 'symbian': $os_name = "Symbian OS"; $os_code = "symbian"; break; } } list($pda_name, $pda_code, $pda_ver) = self::_pda($ua); return array($os_name, $os_code, $os_ver, $pda_name, $pda_code, $pda_ver); } static private function _pda($ua) { $pda_name = $pda_code = $pda_ver = null; if (preg_match('/docomo\/([a-z0-9\.]+)/i', $ua, $matches)) { $pda_name = 'DoCoMo'; $pda_code = 'docomo'; $pda_ver = $matches[1]; if ($pda_ver == '1.0' && preg_match('/docomo\/([a-z0-9\.]+)\/([a-z0-9\.]+)/i', $ua, $matches)) { $pda_ver = $matches[2]; } else if ($pda_ver == '2.0' && preg_match('/docomo\/([a-z0-9\.]+) ([a-z0-9\.]+)/i', $ua, $matches)) { $pda_ver = $matches[2]; } } else if (preg_match('/up\.browser\/[a-z0-9\.]+/i', $ua)) { $pda_name = 'au'; $pda_code = 'au'; if (preg_match('/kddi-([a-z0-9\.]+) up\.browser\/[a-z0-9\.]+/i', $ua, $matches)) { $pda_ver = $matches[1]; } else if (preg_match('/up\.browser\/([a-z0-9\.]+)-([a-z0-9\.]+)/i', $ua, $matches)) { $pda_ver = $matches[2]; } } else if (preg_match('/^mozilla\/5\.0 \(([a-z0-9\.\-]+);softbank/i', $ua, $matches)) { $pda_name = 'SoftBank'; $pda_code = 'softbank'; $pda_ver = $matches[1]; } else if (preg_match('/(j-phone|vodafone|softbank)\/[a-z0-9\.]+\/([a-z0-9\.\-]+)/i', $ua, $matches)) { $pda_name = 'SoftBank'; $pda_code = 'softbank'; $pda_ver = $matches[2]; } else if (preg_match('/(ddipocket|willcom);[a-z0-9\.]+\/([a-z0-9\.\-]+)/i', $ua, $matches)) { $os_name = FALSE; $pda_name = 'WILLCOM'; $pda_code = 'willcom'; $pda_ver = $matches[2]; } else if (preg_match('/palmos\/sony\/model/i', $ua)) { $pda_name = "Sony Clie"; $pda_code = "sony"; } else if (preg_match('/wp\-(iphone|android|blackberry)\/([0-9\.]+)/i', $ua, $matches)) { $pda_name = trim($matches[1]); $pda_code = strtolower($pda_name); $pda_ver = $matches[2]; switch ($pda_code) { case 'iphone': $pda_name = "WordPress for iPhone"; $pda_code = "iphone"; $pda_ver = $matches[2]; break; case 'android': $pda_name = "WordPress for Android"; $pda_code = "android"; $pda_ver = $matches[2]; break; case 'blackberry': $pda_name = "WordPress for BlackBerry"; $pda_code = "blackberry"; $pda_ver = $matches[2]; break; } } else if (preg_match('/(blackberry|\(ip(od|ad|hone);|series |nokia |windows phone os )([0-9\.]+)?/i', $ua, $matches)) { $pda_name = trim($matches[1]); $pda_code = strtolower($pda_name); $pda_ver = $matches[2]; switch ($pda_code) { case 'blackberry': $pda_name = trim("BlackBerry " . $matches[2]); $pda_code = "blackberry"; $pda_ver = null; break; case '(ipod;': $pda_name = "iPod touch"; $pda_code = "ipod"; if (preg_match('/Version\/([a-z0-9\.]+)/', $ua, $matches)) $pda_ver = $matches[1]; break; case '(ipad;': $pda_name = "iPad"; $pda_code = "ipad"; if (preg_match('/Version\/([a-z0-9\.]+)/', $ua, $matches)) $pda_ver = $matches[1]; break; case '(iphone;': $pda_name = "iPhone"; $pda_code = "iphone"; if (preg_match('/Version\/([a-z0-9\.]+)/', $ua, $matches)) $pda_ver = $matches[1]; break; case 'series': $pda_name = "Series"; $pda_code = "nokia"; break; case 'nokia': $pda_name = "Nokia"; $pda_code = "nokia"; break; case 'windows phone os': $pda_name = "Windows Phone"; $pda_code = "windows_phone"; break; } } else if (preg_match('/(zaurus|sie-|dopod|o2 xda |sec-|sonyericsson ?)([a-z0-9\.]+)?/i', $ua, $matches)) { $pda_name = trim($matches[1]); $pda_code = strtolower($pda_name); $pda_ver = $matches[1]; switch ($pda_code) { case 'zaurus': $pda_name = "Sharp Zaurus " . $matches[1]; $pda_code = "zaurus"; $pda_ver = null; break; case 'sie-': $pda_name = "Siemens"; $pda_code = "siemens"; break; case 'dopod': $pda_name = "Dopod"; $pda_code = "dopod"; break; case 'o2 xda': $pda_name = "O2 XDA"; $pda_code = "o2"; break; case 'sec-': $pda_name = "Samsung"; $pda_code = "samsung"; break; case 'sonyericsson': $pda_name = "SonyEricsson"; $pda_code = "sonyericsson"; break; } } return array($pda_name, $pda_code, $pda_ver); } }