PHP Regex用于操作系统检测 [英] PHP Regex for OS detection

查看:80
本文介绍了PHP Regex用于操作系统检测的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下代码来检测用户的操作系统:

I'm using this code for detect the user's 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 El Capitan (10.11.5),此代码表明我正在使用 OS X Puma (10.1)因为'Mac OS X El Capitan' => 'Mac OS X 10.11'.

The problem here is: I'm using OS X El Capitan (10.11.5) and this code shows that I'm using OS X Puma (10.1) because 'Mac OS X El Capitan' => 'Mac OS X 10.11'.

那么,如何告诉preg_match 检查$match是否为"X.Y(.Z)" ?

So, how can I tell to preg_match check if $match is "X.Y(.Z)"?

推荐答案

对于OS X Puma,您可以在1之后添加一个字符类,该字符类仅在紧随其后的字符为 not <时才匹配/em>一个数字,例如:

You could add a character class after the 1 in the case of OS X Puma that will only match if the character following it is not a digit, e.g.:

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

相对于当前版本和将来版本(例如Mac OS X 10.1999.42

This should be safe for reliably detecting version 10.1 versus current and future versions, such as Mac OS X 10.1999.42

应注意,当前与之匹配的用户代理字符串很有可能在浏览器之间不同,甚至可以由用户在其浏览器中进行编辑.如果必须高度成功地进行匹配,则将需要除用户代理嗅探之外的其他方法.

It should be noted that the user agent strings you are currently matching against have a high probability of being different between browsers, or even editable by users from within their browser. If a high degree of success in matching is necessary, an approach other than user agent sniffing would be needed.

这篇关于PHP Regex用于操作系统检测的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆