2016-11-04 90 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'混淆?無論如何,補充說正則表達式解決了我目前的問題。 –