From: Robert Kaiser Date: Thu, 26 Jan 2012 01:10:04 +0000 (+0100) Subject: add some new UAs to the recognition, parse some OSes correctly, finally make WebKit... X-Git-Url: https://git-public.kairo.at/?p=php-utility-classes.git;a=commitdiff_plain;h=1c6b27e785f9016b84c4a1ac40a4761eb64ea36e add some new UAs to the recognition, parse some OSes correctly, finally make WebKit its own engine and parse it correctly, detect Android, iOS, Maemo, MeeGo --- diff --git a/include/classes/useragent.php-class b/include/classes/useragent.php-class index 3414909..a32e5f0 100755 --- a/include/classes/useragent.php-class +++ b/include/classes/useragent.php-class @@ -352,6 +352,11 @@ class userAgent { $this->version = $regs[1]; $this->bot = false; } + elseif (preg_match('|NokiaBrowser/([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) { + $this->brand = 'NokiaBrowser'; + $this->version = $regs[1]; + $this->bot = false; + } elseif (preg_match('|Safari/([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) { $this->brand = 'Safari'; if (preg_match('|Version/([0-9a-zA-Z\.+]+)|', $this->uastring, $vregs)) { @@ -973,8 +978,10 @@ class userAgent { $this->uadata['engine'] = 'trident'; } } - elseif ((strpos($this->brand, 'Konqueror') !== false) || (strpos($this->uastring, 'WebKit/') !== false) || - (strpos($this->brand, 'OmniWeb') !== false)) { + elseif (preg_match('|WebKit/([0-9]+)|', $this->uastring, $regs)) { + $this->uadata['engine'] = 'webkit'; + } + elseif ((strpos($this->brand, 'Konqueror') !== false) || (strpos($this->brand, 'OmniWeb') !== false)) { $this->uadata['engine'] = 'khtml'; } elseif (strpos($this->brand, 'Netscape') !== false) { @@ -1051,6 +1058,11 @@ class userAgent { $this->uadata['lang'] = null; $this->uadata['eng_version'] = $regs[3]; } + elseif (preg_match('|Mozilla/5.0 \(([^;]+); ([^;]+); x64; rv:([^\);]+)(; [^\)]+)?\)|', $this->uastring, $regs)) { + $this->uadata['os'] = $regs[1].' ('.$regs[2].')'; + $this->uadata['lang'] = null; + $this->uadata['eng_version'] = $regs[3]; + } elseif (preg_match('|Mozilla/5.0 \(([^;]+); ([^;]+); ([^;]+); rv:([^\);]+)(; [^\)]+)?\)|', $this->uastring, $regs)) { $this->uadata['os'] = $regs[2]; $this->uadata['lang'] = (strpos($regs[3],'chrome://')===false)?$regs[3]:null; @@ -1071,8 +1083,18 @@ class userAgent { $this->uadata['lang'] = $regs[3]; $this->uadata['eng_version'] = null; } + elseif (preg_match('|Mozilla/5.0 \(([^;]+); (WOW64); rv:([^\);]+)\)|', $this->uastring, $regs)) { + $this->uadata['os'] = $regs[1].' ('.$regs[2].')'; + $this->uadata['lang'] = null; + $this->uadata['eng_version'] = $regs[3]; + } elseif (preg_match('|Mozilla/5.0 \(([^;]+); ([^;]+); rv:([^\);]+)\)|', $this->uastring, $regs)) { - $this->uadata['os'] = $regs[2]; + if ((strpos($regs[2], 'Linux') !== false) && ($regs[1] != 'X11')) { + $this->uadata['os'] = $regs[1].' ('.$regs[2].')'; + } + else { + $this->uadata['os'] = $regs[2]; + } $this->uadata['lang'] = null; $this->uadata['eng_version'] = $regs[3]; } @@ -1145,31 +1167,56 @@ class userAgent { $this->uadata['os'] = $regs[2]; $this->uadata['lang'] = null; } - elseif (preg_match('|Mozilla/5.0 \(([^;]+); U; ([^;]+); ([^\);]+)\)|', $this->uastring, $regs)) { + elseif (preg_match('/Mozilla\/[^\(]+ \(compatible; [^;]+; ([^\);]+)\)/i', $this->uastring, $regs)) { + $this->uadata['os'] = $regs[1]; + $this->uadata['lang'] = null; + $this->uadata['eng_version'] = null; + } + } + elseif ($this->hasEngine('webkit')) { + if (preg_match('|Mozilla/5.0 \(([^;]+); U; ([^;]+); ([^;]+); ([^\);]+)\) AppleWebKit/([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) { + $this->uadata['os'] = $regs[2]; + $this->uadata['lang'] = $regs[3]; + $this->uadata['eng_version'] = $regs[5]; + } + elseif (preg_match('|Mozilla/5.0 \(([^;]+); U; ([^;]+); ([^\);]+)\) AppleWebKit/([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) { if (strpos($regs[3], '/') !== false) { $this->uadata['os'] = $regs[1]; $this->uadata['lang'] = null; - } + } else { $this->uadata['os'] = $regs[2]; $this->uadata['lang'] = $regs[3]; } - $this->uadata['eng_version'] = null; + $this->uadata['eng_version'] = $regs[4]; } - elseif (preg_match('|Mozilla/5.0 \(([^;]+); U; ([^\);]+)\)|', $this->uastring, $regs)) { + elseif (preg_match('|Mozilla/5.0 \(([^;]+); U; ([^\);]+)\) AppleWebKit/([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) { $this->uadata['os'] = $regs[1]; $this->uadata['lang'] = $regs[2]; - $this->uadata['eng_version'] = null; + $this->uadata['eng_version'] = $regs[3]; } - elseif (preg_match('/Mozilla\/[^\(]+ \(compatible; [^;]+; ([^\);]+)\)/i', $this->uastring, $regs)) { + elseif (preg_match('|Mozilla/5.0 \(([^;]+); ([^\);]+)\) AppleWebKit/([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) { + if (($regs[1] == 'X11') || ($regs[1] == 'Macintosh')) { + $this->uadata['os'] = $regs[2]; + } + else { + $this->uadata['os'] = $regs[1]; + if ($regs[2] == 'NokiaN9') { + $this->uadata['os'] .= ' Harmattan'; + } + } + $this->uadata['lang'] = null; + $this->uadata['eng_version'] = $regs[3]; + } + elseif (preg_match('|Mozilla/5.0 \(([^\);]+)\) AppleWebKit/([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) { $this->uadata['os'] = $regs[1]; $this->uadata['lang'] = null; - $this->uadata['eng_version'] = null; + $this->uadata['eng_version'] = $regs[2]; } - elseif (preg_match('/Midori\/[^\(]+ \((?:X11; )?([^;]+); U; ([^\)]+)\) WebKit/i', $this->uastring, $regs)) { - $this->uadata['eng_version'] = null; + elseif (preg_match('|Midori/[^\(]+ \((?:X11; )?([^;]+); U; ([^\)]+)\) WebKit/([0-9a-zA-Z\.+]+)|i', $this->uastring, $regs)) { $this->uadata['os'] = $regs[1]; $this->uadata['lang'] = $regs[2]; + $this->uadata['eng_version'] = $regs[3]; } } elseif ($this->hasEngine('presto')) { @@ -1312,19 +1359,24 @@ class userAgent { elseif ($this->uadata['os'] == 'WinNT') { $this->uadata['os'] = 'Windows NT'; } elseif ($this->uadata['os'] == 'Win32') { $this->uadata['os'] = 'Windows (32bit)'; } elseif ($this->uadata['os'] == 'Win64') { $this->uadata['os'] = 'Windows (64bit)'; } - elseif (preg_match('/Mac ?OS ?X/i',$this->uadata['os'])) { $this->uadata['os'] = 'MacOS X'; } - elseif (preg_match('/Mac_P(ower|)PC/i',$this->uadata['os'])) { $this->uadata['os'] = 'MacOS'; } + elseif (preg_match('/iPhone OS ([\d_]+)/i', $this->uadata['os'], $regs)) { $this->uadata['os'] = 'iOS '.str_replace('_', '.', $regs[1]); } + elseif (preg_match('/Mac ?OS ?X/i', $this->uadata['os'])) { $this->uadata['os'] = 'MacOS X'; } + elseif (preg_match('/Mac_P(ower|)PC/i', $this->uadata['os'])) { $this->uadata['os'] = 'MacOS'; } elseif (strpos($this->uadata['os'], 'darwin') !== false) { $this->uadata['os'] = 'MacOS X'; } elseif (strpos($this->uadata['os'], 'Darwin') !== false) { $this->uadata['os'] = 'MacOS X'; } elseif (strpos($this->uadata['os'], 'apple') !== false) { $this->uadata['os'] = 'MacOS'; } elseif (strpos($this->uadata['os'], 'Macintosh') !== false) { $this->uadata['os'] = 'MacOS'; } + elseif (preg_match('/Android \(Linux (.+)\)/i', $this->uadata['os'], $regs)) { $this->uadata['os'] = 'Android '.$regs[1]; } elseif (strpos($this->uadata['os'], 'linux') !== false) { $this->uadata['os'] = 'Linux'; } elseif (preg_match('/SymbianOS[\/ ]([0-9a-zA-Z\._+]+)/i', $this->uastring, $regs)) { $this->uadata['os'] = 'SymbianOS '.$regs[1]; } - elseif (preg_match('/Symbian ?OS/i',$this->uadata['os'])) { $this->uadata['os'] = 'SymbianOS'; } + elseif (preg_match('/Symbian ?OS/i', $this->uadata['os'])) { $this->uadata['os'] = 'SymbianOS'; } if (strpos($this->uadata['os'], 'Win') !== false) { $this->uadata['platform'] = 'Windows'; } elseif (strpos($this->uadata['os'], 'Mac') !== false) { $this->uadata['platform'] = 'Macintosh'; } + elseif (strpos($this->uadata['os'], 'iOS') !== false) { $this->uadata['platform'] = 'Macintosh'; } elseif (strpos($this->uadata['os'], 'Linux') !== false) { $this->uadata['platform'] = 'Linux'; } + elseif (strpos($this->uadata['os'], 'MeeGo') !== false) { $this->uadata['platform'] = 'Linux'; } + elseif (strpos($this->uadata['os'], 'Android') !== false) { $this->uadata['platform'] = 'Android'; } elseif (strpos($this->uadata['os'], 'Solaris') !== false) { $this->uadata['platform'] = 'Solaris'; } elseif (strpos($this->uadata['os'], 'SunOS') !== false) { $this->uadata['platform'] = 'Solaris'; } elseif (strpos($this->uadata['os'], 'BeOS') !== false) { $this->uadata['platform'] = 'BeOS'; } diff --git a/testbed/ua_list_raw.txt b/testbed/ua_list_raw.txt index ee2cef1..3717215 100755 --- a/testbed/ua_list_raw.txt +++ b/testbed/ua_list_raw.txt @@ -41,6 +41,9 @@ Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (Windows NT 6.0; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre +Mozilla/5.0 (Windows NT 6.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0a1) Gecko/20120117 Firefox/12.0a1 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:12.0a1) Gecko/20100101 Firefox/12.0a1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre @@ -50,7 +53,9 @@ Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (X11; Linux i686; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Mozilla/5.0 (Android; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1 Mozilla/5.0 (Android; Linux armv7l; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Fennec/2.0b1pre +Mozilla/5.0 (Android; Linux armv7l; rv:12.0a1) Gecko/20120125 Firefox/12.0a1 Fennec/12.0a1 Mozilla/5.0 (Maemo; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1 +Mozilla/5.0 (Maemo; Linux armv7l; rv:12.0a1) Gecko/20120122 Firefox/12.0a1 Fennec/12.0a1 Mozilla/5.0 (X11; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1 Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1 Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1 @@ -150,12 +155,19 @@ Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.0 (like Gecko) Mozilla/5.0 (compatible; Konqueror/3.3; Linux; X11; i686; es, en_US) KHTML/3.3.2 (like Gecko) Mozilla/5.0 (Windows; U; Windows NT 5.1; de) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/51 (like Gecko) Safari/51 +Mozilla/5.0 (iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10 +Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF 101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC) OmniWeb/4.1.1-v424.6 Mozilla/4.5 (compatible; OmniWeb/4.1.1-v423; Mac_PowerPC) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v540 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.51 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/418 (KHTML, like Gecko) Shiira/1.2.2 Safari/125 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.62 Safari/534.3 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.33 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.109 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.51 (KHTML, like Gecko; Google Web Preview) Chrome/12.0.742 Safari/534.51 Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Nokia5800d-1/21.0.025; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413 Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 Mozilla/5.0 (webOS/1.1; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0