2016-11-04 53 views
0

我使用这个代码检测用户的操作系统:PHP正则表达式OS检测

<? 
$osList = array (
/* -- WINDOWS -- */ 
'Windows 10 (Windows NT 10.0)' => 'windows nt 10.0', 
'Windows 8.1 (Windows NT 6.3)' => 'windows nt 6.3', 
'Windows 8 (Windows NT 6.2)' => 'windows nt 6.2', 
'Windows 7 (Windows NT 6.1)' => 'windows nt 6.1', 
'Windows Vista (Windows NT 6.0)' => 'windows nt 6.0', 
'Windows Server 2003 (Windows NT 5.2)' => 'windows nt 5.2', 
'Windows XP (Windows NT 5.1)' => 'windows nt 5.1', 
'Windows 2000 sp1 (Windows NT 5.01)' => 'windows nt 5.01', 
'Windows 2000 (Windows NT 5.0)' => 'windows nt 5.0', 
'Windows NT 4.0' => 'windows nt 4.0', 
'Windows Me (Windows 9x 4.9)' => 'win 9x 4.9', 
'Windows 98' => 'windows 98', 
'Windows 95' => 'windows 95', 
'Windows CE' => 'windows ce', 
'Windows (version unknown)' => 'windows', 
/* -- MAC OS X -- */ 
'Mac OS X Beta (Kodiak)' => 'Mac OS X beta', 
'Mac OS X Cheetah' => 'Mac OS X 10.0', 
'Mac OS X Puma' => 'Mac OS X 10.1', 
'Mac OS X Jaguar' => 'Mac OS X 10.2', 
'Mac OS X Panther' => 'Mac OS X 10.3', 
'Mac OS X Tiger' => 'Mac OS X 10.4', 
'Mac OS X Leopard' => 'Mac OS X 10.5', 
'Mac OS X Snow Leopard' => 'Mac OS X 10.6', 
'Mac OS X Lion' => 'Mac OS X 10.7', 
'Mac OS X Mountain Lion' => 'Mac OS X 10.8', 
'Mac OS X Mavericks' => 'Mac OS X 10.9', 
'Mac OS X Yosemite' => 'Mac OS X 10.10', 
'Mac OS X El Capitan' => 'Mac OS X 10.11', 
'macOS Sierra' => 'Mac OS X 10.12', 
'Mac OS X (version unknown)' => 'Mac OS X', 
'Mac OS (classic)' => '(mac_powerpc)|(macintosh)', 
/* -- OTHERS -- */ 
'OpenBSD' => 'openbsd', 
'SunOS' => 'sunos', 
'Ubuntu' => 'ubuntu', 
'Linux (or Linux based)' => '(linux)|(x11)', 
'QNX' => 'QNX', 
'BeOS' => 'beos', 
'OS2' => 'os/2', 
'SearchBot'=>'(nuhk)|(googlebot)|(yammybot)|(openbot)|(slurp)|(msnbot)|(ask jeeves/teoma)|(ia_archiver)' 
); 

$useragent = htmlspecialchars($_SERVER['HTTP_USER_AGENT']); 
$useragent = strtolower($useragent); 

foreach($osList as $os=>$match) { 
    if (preg_match('/' . $match . '/i', $useragent)) { 
     break; 
    } else { 
     $os = "Unknown";  
    } 
} 
?> 

这里的问题是:我使用OS X埃尔卡皮坦(10.11.5)和验证码显示我正在使用OS X Puma(10.1),因为'Mac OS X El Capitan' => 'Mac OS X 10.11'

所以,我怎么能告诉preg_match检查是否$match是 “X.Y(.Z)”

+0

'strpos()'在这里有任何帮助吗? – Maximus2012

+0

我不确定。你能提供一个使用的例子吗?谢谢。 –

+2

请问[此问题](http://stackoverflow.com/q/18070154/697370)是否有适合您的答案?如果是这样,我们可以把它作为一个副本来关闭。 –

回答

2

你可以,如果字符以下是不是一个数字,例如,在OS X美洲豹的情况下,将只匹配1后添加字符类:

'Mac OS X Puma' => 'Mac OS X 10.1[^0-9]', 

这应该是安全的可靠地检测10.1对当前和未来的版本,如Mac OS X 10.1999.42


应当注意的是,你正在对匹配的用户代理字符串具有较高浏览器之间不同的可能性,甚至浏览器中的用户都可以编辑。如果匹配的成功程度很高,则需要使用除用户代理嗅探以外的方法。

+0

好的方法,谢谢! '[^ 0-9]'是否考虑点?例如:'10.11.5'。 –

+0

它所说的只是_will_是一个字符,只要它不是一个数字就会匹配。上面正则表达式中的点不会被转义,因此它们实际上与用户代理字符串中的_underscores_匹配。下划线不是数字,因此它会匹配,例如版本10.1的版本53的“10_1_53”(如果存在这样的版本)。 –

+0

那意味着'10.1.10'可以和'10.11.5'混淆?无论如何,补充说正则表达式解决了我目前的问题。 –