// // Finds useful info from User-Agent header: // - platform name and type (desktop/tv/mobile) // - browser name and version (including weird stuff like Opera/9.80 Version/11.50) // - engine name and version (useful!) class Fast_UA_finder { static protected $platforms = array( 'mobile' => 'Maemo|Meego|iPhone|iPad|BlackBerry|Symbian|SymbOS|Series\s*60|S60|Android|Palm|Windows (?:CE|Phone|Mobile)|Kindle|Nokia|LGE|Vodafone|samsung|SonyEricsson|UP.browser|MIDP|J2ME|PDA|WAP', 'tv' => 'Nintendo|Playstation|WebTV|GoogleTV', 'desktop' => 'Linux|Win(?:dows)?(?: (?:XP|Vista|Me|95|98|NT [0-9.]+))?|Mac OS X|[a-z]+BSD|Amiga|Haiku|BeOS|OS/2|Mac|RISC OS|SunOS|Unix', ); static protected $browsers = '(Opera)/9\.[89][0-9].* Version/(\d+(?:\.\d+)?)|(Opera Mobi)/.* Version/(\d+(?:\.\d+)?)|Version/(\d+(?:\.\d+)?).*(Safari)/|(Safari)/.*Version/(\d+(?:\.\d+)?)|(Blazer|Safari|Opera Mini|Iceape|Camino|Firefox|Epiphany|Chrome|Iceweasel|SeaMonkey|NetSurf|amaya|Arora|curl|Dillo|Elinks|Lynx|w3m|wget|Fennec|Flock|Galeon|iCab|Kazehakase|K-Meleon|Konqueror|Midori|NetPositive|Netscape|Omniweb|Opera|Songbird|Iron|WebPositive|AvantGo|Minimo|NetFront|Xiino|MSIE)[\s/](\d+(?:\.\d+)?)'; static protected $engines = '(Gecko|Presto|WebKit|KHTML|Trident|NetSurf|Lynx|w3m|amaya|Dillo|ELinks)[/ ](\d+(?:\.\d+)?)'; static public function getPlatform($str) { foreach (self::$platforms as $type=>$regexp) { if (preg_match('!('.$regexp.')!i', $str, $match)) { return array( 'type' => $type, 'name' => strtolower($match[1]), ); } } return false; } static public function getBrowser($str) { if (!preg_match('!'.self::$browsers.'!i', $str, $match)) return false; unset($match[0]); $r = array('version' => null, 'name' => null); foreach ($match as $m) { if (preg_match('!^[\d.]+$!', $m)) $r['version'] = $m; elseif (trim($m)) $r['name'] = $m; if ($r['version'] && $r['name']) return $r; } return false; } static public function getEngine($str) { if (!preg_match('!'.self::$engines.'!i', $str, $match)) return false; unset($match[0]); $r = array('version' => null, 'name' => null); foreach ($match as $m) { if (preg_match('!^[\d.]+$!', $m)) $r['version'] = $m; elseif (trim($m)) $r['name'] = $m; if ($r['version'] && $r['name']) return $r; } return false; } } ?>