2016-11-04 9 views
0

Я использую этот код для обнаружения ОС пользователя:PHP Regex для определения ОС

<? 
$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'.

Итак, как я могу сказать preg_matchпроверки, если $match является "X.Y (.Z)"?

+0

Помогает ли здесь 'strpos()' здесь? – Maximus2012

+0

Я не уверен. Можете ли вы привести пример использования? Благодарю. –

+2

Имеет ли [этот вопрос] (http://stackoverflow.com/q/18070154/697370) ответ, который вам подходит? Если это так, мы можем закрыть это как дубликат. –

ответ

2

Вы можете добавить класс персонажа после 1 в случае OS X Puma, которая будет соответствовать только если символ, следующий за это не цифра, например:

'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' для версии 53 версии 10.1 (если такая версия существует). –

+0

Это означает, что '10.1.10' можно путать с' 10.11.5'? В любом случае, добавив, что Regex решает мою текущую проблему. –