2013-08-06 2 views
77

Недавно я начал задаваться вопросом о таких сайтах, как http://thismachine.info/, которые получают информацию об операционной системе пользователя. Я не смог узнать, как это сделать с PHP, и хотел попытаться понять это.Получить информацию о операционной системе

Я заметил, что они перечисляют user-agent, что дает много информации о браузере. Получают ли они информацию о операционной системе, или что-то еще? Есть ли API, который я мог бы использовать для получения операционной системы пользователя?

Я вижу, как они получили браузер и IP-адрес, но не смогли выяснить часть операционной системы!

+0

Как [** Амаль Murali * *] (http://stackoverflow.com/a/18070175/1415724) в своем ответе ниже: 'echo $ _SERVER ['HTTP_USER_AGENT'];' покажет (в определенной степени) операционную систему пользователя. Для меня он обнаружил «Mozilla/5.0 (Windows NT 5.1; rv: 22.0) Gecko/20100101 Firefox/22.0', где я фактически использую Windows XP, поэтому это не точная наука. –

+0

Что касается того, как 'http: // thismachine.info /' знает, что я использую Windows XP? Этого я не знаю, однако они должны использовать сценарий, который найдет и заменит, а затем повторит его. Насколько я знаю, нет ничего, что определит точную операционную систему, поскольку я вижу, что это попадет под домен ценных бумаг. –

+0

Я ответил на свой вопрос. Если вы посетите этот ответ на SO http://stackoverflow.com/a/15497878/1415724, вы заметите, как они отгоняют «Windows XP» из массива '/ windows nt 5.1/i '=>' Windows XP ',' –

ответ

166

Код, приведенный ниже, может объяснить сам по себе, как http://thismachine.info/ способен показать, какую операционную систему использует кто-то.

Что он делает, так это то, что он обнюхивает вашу основную модель операционной системы, например windows nt 5.1 как мой собственный.

Затем он передает Windows nt 5.1/i в Windows XP в качестве операционной системы.

Использование: '/windows nt 5.1/i' => 'Windows XP', из массива.

Вы могли бы сказать догадки или приближение, но тем не менее в значительной степени вздрогнули.

Заимствованные из ответа на SO https://stackoverflow.com/a/15497878/

<?php 

$user_agent = $_SERVER['HTTP_USER_AGENT']; 

function getOS() { 

    global $user_agent; 

    $os_platform = "Unknown OS Platform"; 

    $os_array  = array(
          '/windows nt 10/i'  => 'Windows 10', 
          '/windows nt 6.3/i'  => 'Windows 8.1', 
          '/windows nt 6.2/i'  => 'Windows 8', 
          '/windows nt 6.1/i'  => 'Windows 7', 
          '/windows nt 6.0/i'  => 'Windows Vista', 
          '/windows nt 5.2/i'  => 'Windows Server 2003/XP x64', 
          '/windows nt 5.1/i'  => 'Windows XP', 
          '/windows xp/i'   => 'Windows XP', 
          '/windows nt 5.0/i'  => 'Windows 2000', 
          '/windows me/i'   => 'Windows ME', 
          '/win98/i'    => 'Windows 98', 
          '/win95/i'    => 'Windows 95', 
          '/win16/i'    => 'Windows 3.11', 
          '/macintosh|mac os x/i' => 'Mac OS X', 
          '/mac_powerpc/i'  => 'Mac OS 9', 
          '/linux/i'    => 'Linux', 
          '/ubuntu/i'    => 'Ubuntu', 
          '/iphone/i'    => 'iPhone', 
          '/ipod/i'    => 'iPod', 
          '/ipad/i'    => 'iPad', 
          '/android/i'   => 'Android', 
          '/blackberry/i'   => 'BlackBerry', 
          '/webos/i'    => 'Mobile' 
        ); 

    foreach ($os_array as $regex => $value) 
     if (preg_match($regex, $user_agent)) 
      $os_platform = $value; 

    return $os_platform; 
} 

function getBrowser() { 

    global $user_agent; 

    $browser  = "Unknown Browser"; 

    $browser_array = array(
          '/msie/i'  => 'Internet Explorer', 
          '/firefox/i' => 'Firefox', 
          '/safari/i' => 'Safari', 
          '/chrome/i' => 'Chrome', 
          '/edge/i'  => 'Edge', 
          '/opera/i'  => 'Opera', 
          '/netscape/i' => 'Netscape', 
          '/maxthon/i' => 'Maxthon', 
          '/konqueror/i' => 'Konqueror', 
          '/mobile/i' => 'Handheld Browser' 
        ); 

    foreach ($browser_array as $regex => $value) 
     if (preg_match($regex, $user_agent)) 
      $browser = $value; 

    return $browser; 
} 


$user_os  = getOS(); 
$user_browser = getBrowser(); 

$device_details = "<strong>Browser: </strong>".$user_browser."<br /><strong>Operating System: </strong>".$user_os.""; 

print_r($device_details); 

echo("<br /><br /><br />".$_SERVER['HTTP_USER_AGENT'].""); 

?> 

Сноски: (январь 19/14) Там был suggested edit на 18 января 2014 года, чтобы добавить /msie|trident/i на YJSoft новый член на SO.

Комментарий гласил:

Комментарий: потому что иа msie11 не включает MSIE (она включает в себя трезубцем вместо этого)

Я исследовал это немного, и нашел несколько ссылок, объясняющие строку Trident.

Хотя редактировать был rejected (не сам, а некоторые из других редакторов), это стоит читать на ссылки выше, и использовать правильное решение.


Согласно вопрос, заданный об обнаружении SUSE, нашел этот кусок кода по следующему адресу:

Дополнительный код:

/* return Operating System */ 
function operating_system_detection(){ 
    if (isset($_SERVER)) { 
     $agent = $_SERVER['HTTP_USER_AGENT']; 
    } 
    else { 
     global $HTTP_SERVER_VARS; 
     if (isset($HTTP_SERVER_VARS)) { 
      $agent = $HTTP_SERVER_VARS['HTTP_USER_AGENT']; 
     } 
     else { 
      global $HTTP_USER_AGENT; 
      $agent = $HTTP_USER_AGENT; 
     } 
    } 
    $ros[] = array('Windows XP', 'Windows XP'); 
    $ros[] = array('Windows NT 5.1|Windows NT5.1)', 'Windows XP'); 
    $ros[] = array('Windows 2000', 'Windows 2000'); 
    $ros[] = array('Windows NT 5.0', 'Windows 2000'); 
    $ros[] = array('Windows NT 4.0|WinNT4.0', 'Windows NT'); 
    $ros[] = array('Windows NT 5.2', 'Windows Server 2003'); 
    $ros[] = array('Windows NT 6.0', 'Windows Vista'); 
    $ros[] = array('Windows NT 7.0', 'Windows 7'); 
    $ros[] = array('Windows CE', 'Windows CE'); 
    $ros[] = array('(media center pc).([0-9]{1,2}\.[0-9]{1,2})', 'Windows Media Center'); 
    $ros[] = array('(win)([0-9]{1,2}\.[0-9x]{1,2})', 'Windows'); 
    $ros[] = array('(win)([0-9]{2})', 'Windows'); 
    $ros[] = array('(windows)([0-9x]{2})', 'Windows'); 
    // Doesn't seem like these are necessary...not totally sure though.. 
    //$ros[] = array('(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'Windows NT'); 
    //$ros[] = array('(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})', 'Windows NT'); // fix by bg 
    $ros[] = array('Windows ME', 'Windows ME'); 
    $ros[] = array('Win 9x 4.90', 'Windows ME'); 
    $ros[] = array('Windows 98|Win98', 'Windows 98'); 
    $ros[] = array('Windows 95', 'Windows 95'); 
    $ros[] = array('(windows)([0-9]{1,2}\.[0-9]{1,2})', 'Windows'); 
    $ros[] = array('win32', 'Windows'); 
    $ros[] = array('(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})', 'Java'); 
    $ros[] = array('(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}', 'Solaris'); 
    $ros[] = array('dos x86', 'DOS'); 
    $ros[] = array('unix', 'Unix'); 
    $ros[] = array('Mac OS X', 'Mac OS X'); 
    $ros[] = array('Mac_PowerPC', 'Macintosh PowerPC'); 
    $ros[] = array('(mac|Macintosh)', 'Mac OS'); 
    $ros[] = array('(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'SunOS'); 
    $ros[] = array('(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'BeOS'); 
    $ros[] = array('(risc os)([0-9]{1,2}\.[0-9]{1,2})', 'RISC OS'); 
    $ros[] = array('os/2', 'OS/2'); 
    $ros[] = array('freebsd', 'FreeBSD'); 
    $ros[] = array('openbsd', 'OpenBSD'); 
    $ros[] = array('netbsd', 'NetBSD'); 
    $ros[] = array('irix', 'IRIX'); 
    $ros[] = array('plan9', 'Plan9'); 
    $ros[] = array('osf', 'OSF'); 
    $ros[] = array('aix', 'AIX'); 
    $ros[] = array('GNU Hurd', 'GNU Hurd'); 
    $ros[] = array('(fedora)', 'Linux - Fedora'); 
    $ros[] = array('(kubuntu)', 'Linux - Kubuntu'); 
    $ros[] = array('(ubuntu)', 'Linux - Ubuntu'); 
    $ros[] = array('(debian)', 'Linux - Debian'); 
    $ros[] = array('(CentOS)', 'Linux - CentOS'); 
    $ros[] = array('(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - Mandriva'); 
    $ros[] = array('(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - SUSE'); 
    $ros[] = array('(Dropline)', 'Linux - Slackware (Dropline GNOME)'); 
    $ros[] = array('(ASPLinux)', 'Linux - ASPLinux'); 
    $ros[] = array('(Red Hat)', 'Linux - Red Hat'); 
    // Loads of Linux machines will be detected as unix. 
    // Actually, all of the linux machines I've checked have the 'X11' in the User Agent. 
    //$ros[] = array('X11', 'Unix'); 
    $ros[] = array('(linux)', 'Linux'); 
    $ros[] = array('(amigaos)([0-9]{1,2}\.[0-9]{1,2})', 'AmigaOS'); 
    $ros[] = array('amiga-aweb', 'AmigaOS'); 
    $ros[] = array('amiga', 'Amiga'); 
    $ros[] = array('AvantGo', 'PalmOS'); 
    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1}-([0-9]{1,2}) i([0-9]{1})86){1}', 'Linux'); 
    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1} i([0-9]{1}86)){1}', 'Linux'); 
    //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})', 'Linux'); 
    $ros[] = array('[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3})', 'Linux'); 
    $ros[] = array('(webtv)/([0-9]{1,2}\.[0-9]{1,2})', 'WebTV'); 
    $ros[] = array('Dreamcast', 'Dreamcast OS'); 
    $ros[] = array('GetRight', 'Windows'); 
    $ros[] = array('go!zilla', 'Windows'); 
    $ros[] = array('gozilla', 'Windows'); 
    $ros[] = array('gulliver', 'Windows'); 
    $ros[] = array('ia archiver', 'Windows'); 
    $ros[] = array('NetPositive', 'Windows'); 
    $ros[] = array('mass downloader', 'Windows'); 
    $ros[] = array('microsoft', 'Windows'); 
    $ros[] = array('offline explorer', 'Windows'); 
    $ros[] = array('teleport', 'Windows'); 
    $ros[] = array('web downloader', 'Windows'); 
    $ros[] = array('webcapture', 'Windows'); 
    $ros[] = array('webcollage', 'Windows'); 
    $ros[] = array('webcopier', 'Windows'); 
    $ros[] = array('webstripper', 'Windows'); 
    $ros[] = array('webzip', 'Windows'); 
    $ros[] = array('wget', 'Windows'); 
    $ros[] = array('Java', 'Unknown'); 
    $ros[] = array('flashget', 'Windows'); 
    // delete next line if the script show not the right OS 
    //$ros[] = array('(PHP)/([0-9]{1,2}.[0-9]{1,2})', 'PHP'); 
    $ros[] = array('MS FrontPage', 'Windows'); 
    $ros[] = array('(msproxy)/([0-9]{1,2}.[0-9]{1,2})', 'Windows'); 
    $ros[] = array('(msie)([0-9]{1,2}.[0-9]{1,2})', 'Windows'); 
    $ros[] = array('libwww-perl', 'Unix'); 
    $ros[] = array('UP.Browser', 'Windows CE'); 
    $ros[] = array('NetAnts', 'Windows'); 
    $file = count ($ros); 
    $os = ''; 
    for ($n=0 ; $n<$file ; $n++){ 
     if (preg_match('/'.$ros[$n][0].'/i' , $agent, $name)){ 
      $os = @$ros[$n][1].' '[email protected]$name[2]; 
      break; 
     } 
    } 
    return trim ($os); 
} 

Редактировать: April 12, 2015

Я вчера вчера заметил вопрос, который может иметь отношение к этому вопросу Q & A и может быть полезна для некоторых. В отношении:

Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-GT-I9505 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36


Другой редактировать, и добавив ссылку ссылку который был задан (и ответил/принятые сегодня, 4/16 ноября), которые могут быть полезны.

Обратитесь к Q & А вот на стеке:

+0

Что относительно Windows 8.1? –

+0

@HamedKamrava Я уверен, что ''/windows nt 6.2/i '=>' Windows 8 ', 'в коде покроет его. –

+0

№ Моя операционная система - Windows 8.1, но результат «Операционная система: неизвестная платформа ОС» –

10

Когда вы переходите на сайт, ваш браузер отправляет запрос на веб-сервер, включая много информации. Эта информация может выглядеть примерно так:

GET /questions/18070154/get-operating-system-info-with-php HTTP/1.1 
Host: stackoverflow.com 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 
      (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate,sdch 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Cookie: <cookie data removed> 
Pragma: no-cache 
Cache-Control: no-cache 

Эти данные все используются веб-сервером для определения способа обработки запроса; предпочтительный язык и разрешено ли сжатие.

В PHP вся эта информация хранится в массиве $_SERVER. Чтобы узнать, что вы отправляете на веб-сервер, создайте новый PHP-файл и распечатайте все из массива.

<pre><?php print_r($_SERVER); ?></pre> 

Это даст вам хорошее представление обо всем, что будут посылаться на сервер, откуда можно извлечь нужную информацию, например, $_SERVER['HTTP_USER_AGENT'], чтобы получить операционную систему и браузер.

+3

Чтобы сделать это более читаемым, я обычно делаю эхо "

"; print_r($_SERVER); echo "
«; Это личное предпочтение, но оно помогает мне читать большие массивы, и это большой массив. – smcjones

+3

@smcjones: вам лучше: echo '

'.print_r($_SERVER, true).'
'; это чище, как это :) –

0

Вы можете найти эту информацию в $_SERVER['HTTP_USER_AGENT'], но ее формат является бесплатным, не гарантируется, что его можно отправить, и его легко изменить, будь то конфиденциальность или по другим причинам.

Если вы не указали директиву browsecap, это вернет предупреждение. Чтобы убедиться, что он установлен, вы можете получить значение с помощью ini_get и посмотреть, установлено ли оно.

if(ini_get("browscap")) { 
    $browser = get_browser(null, true); 
    $browser = get_browser($_SERVER['HTTP_USER_AGENT']); 
} 

Как KBA объяснил в своем ответе, ваш браузер посылает много информации на сервер при загрузке веб-страницы. Большинство веб-сайтов используют данные User-agent для определения операционной системы посетителя, браузера и различной информации.

4

Взял следующий код из руководства php для get_browser.

$browser = get_browser(null, true); 
print_r($browser); 

$browser массива имеет platform информацию, включенная которая дает конкретную операционную систему в использовании.

Обязательно ознакомьтесь с разделом «Примечания» на этой странице. Это может быть что-то (thismachine.info), если не что-то уже указываемое в других ответах.

6

Если вы хотите, чтобы получить все эти сведения, вы можете прочитать:
http://php.net/manual/en/function.get-browser.php

Вы можете запустить пример кода, и вы увидите, как это работает:

<?php 
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n"; 

$browser = get_browser(null, true); 
print_r($browser); 
?> 

выше пример будет выводить что-то похожее на:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 

Array 
(
    [browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$ 
    [browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9* 
    [parent] => Firefox 0.9 
    [platform] => WinXP 
    [browser] => Firefox 
    [version] => 0.9 
    [majorver] => 0 
    [minorver] => 9 
    [cssversion] => 2 
    [frames] => 1 
    [iframes] => 1 
    [tables] => 1 
    [cookies] => 1 
    [backgroundsounds] => 
    [vbscript] => 
    [javascript] => 1 
    [javaapplets] => 1 
    [activexcontrols] => 
    [cdf] => 
    [aol] => 
    [beta] => 1 
    [win16] => 
    [crawler] => 
    [stripper] => 
    [wap] => 
    [netclr] => 
) 
+0

Я пытался исправить подсветку синтаксиса в вашем ответе, но вы отклонили редактирование ... –

+0

Я намеренно хотел, чтобы только [browser_name_regex] и [browser_name_pattern] подсвечивались иначе, вы ничего не сделали неправильно. Хорошо? – OmniPotens

0

Если вы хотите очень мало информации, как класс в вашем HTML для обычных браузеров, например, вы можете использовать:

function get_browser() 
{ 
    $browser = ''; 
    $ua = strtolower($_SERVER['HTTP_USER_AGENT']); 
    if (preg_match('~(?:msie ?|trident.+?; ?rv: ?)(\d+)~', $ua, $matches)) $browser = 'ie ie'.$matches[1]; 
    elseif (preg_match('~(safari|chrome|firefox)~', $ua, $matches)) $browser = $matches[1]; 

    return $browser; 
} 

, который будет возвращать «сафари» или «firefox» или «chrome», или «ie ie8», т.е. ie9 ',' ie ie10 ',' ie ie11 '.

4

Основываясь на answer по Fred-II Я хотел бы поделиться своим взять на себя функции getOS, он избегает глобалам, объединяет оба списка и определяет архитектуру (x32/x64)

/** 
* @param $user_agent null 
* @return string 
*/ 
function getOS($user_agent = null) 
{ 
    if(!isset($user_agent) && isset($_SERVER['HTTP_USER_AGENT'])) { 
     $user_agent = $_SERVER['HTTP_USER_AGENT']; 
    } 

    // https://stackoverflow.com/questions/18070154/get-operating-system-info-with-php 
    $os_array = [ 
     'windows nt 10'        => 'Windows 10', 
     'windows nt 6.3'        => 'Windows 8.1', 
     'windows nt 6.2'        => 'Windows 8', 
     'windows nt 6.1|windows nt 7.0'    => 'Windows 7', 
     'windows nt 6.0'        => 'Windows Vista', 
     'windows nt 5.2'        => 'Windows Server 2003/XP x64', 
     'windows nt 5.1'        => 'Windows XP', 
     'windows xp'         => 'Windows XP', 
     'windows nt 5.0|windows nt5.1|windows 2000' => 'Windows 2000', 
     'windows me'         => 'Windows ME', 
     'windows nt 4.0|winnt4.0'     => 'Windows NT', 
     'windows ce'         => 'Windows CE', 
     'windows 98|win98'       => 'Windows 98', 
     'windows 95|win95'       => 'Windows 95', 
     'win16'          => 'Windows 3.11', 
     'mac os x 10.1[^0-9]'      => 'Mac OS X Puma', 
     'macintosh|mac os x'       => 'Mac OS X', 
     'mac_powerpc'        => 'Mac OS 9', 
     'linux'          => 'Linux', 
     'ubuntu'          => 'Linux - Ubuntu', 
     'iphone'          => 'iPhone', 
     'ipod'          => 'iPod', 
     'ipad'          => 'iPad', 
     'android'         => 'Android', 
     'blackberry'         => 'BlackBerry', 
     'webos'          => 'Mobile', 

     '(media center pc).([0-9]{1,2}\.[0-9]{1,2})'=>'Windows Media Center', 
     '(win)([0-9]{1,2}\.[0-9x]{1,2})'=>'Windows', 
     '(win)([0-9]{2})'=>'Windows', 
     '(windows)([0-9x]{2})'=>'Windows', 

     // Doesn't seem like these are necessary...not totally sure though.. 
     //'(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'Windows NT', 
     //'(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})'=>'Windows NT', // fix by bg 

     'Win 9x 4.90'=>'Windows ME', 
     '(windows)([0-9]{1,2}\.[0-9]{1,2})'=>'Windows', 
     'win32'=>'Windows', 
     '(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})'=>'Java', 
     '(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}'=>'Solaris', 
     'dos x86'=>'DOS', 
     'Mac OS X'=>'Mac OS X', 
     'Mac_PowerPC'=>'Macintosh PowerPC', 
     '(mac|Macintosh)'=>'Mac OS', 
     '(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'SunOS', 
     '(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}'=>'BeOS', 
     '(risc os)([0-9]{1,2}\.[0-9]{1,2})'=>'RISC OS', 
     'unix'=>'Unix', 
     'os/2'=>'OS/2', 
     'freebsd'=>'FreeBSD', 
     'openbsd'=>'OpenBSD', 
     'netbsd'=>'NetBSD', 
     'irix'=>'IRIX', 
     'plan9'=>'Plan9', 
     'osf'=>'OSF', 
     'aix'=>'AIX', 
     'GNU Hurd'=>'GNU Hurd', 
     '(fedora)'=>'Linux - Fedora', 
     '(kubuntu)'=>'Linux - Kubuntu', 
     '(ubuntu)'=>'Linux - Ubuntu', 
     '(debian)'=>'Linux - Debian', 
     '(CentOS)'=>'Linux - CentOS', 
     '(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)'=>'Linux - Mandriva', 
     '(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)'=>'Linux - SUSE', 
     '(Dropline)'=>'Linux - Slackware (Dropline GNOME)', 
     '(ASPLinux)'=>'Linux - ASPLinux', 
     '(Red Hat)'=>'Linux - Red Hat', 
     // Loads of Linux machines will be detected as unix. 
     // Actually, all of the linux machines I've checked have the 'X11' in the User Agent. 
     //'X11'=>'Unix', 
     '(linux)'=>'Linux', 
     '(amigaos)([0-9]{1,2}\.[0-9]{1,2})'=>'AmigaOS', 
     'amiga-aweb'=>'AmigaOS', 
     'amiga'=>'Amiga', 
     'AvantGo'=>'PalmOS', 
     //'(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1}-([0-9]{1,2}) i([0-9]{1})86){1}'=>'Linux', 
     //'(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1} i([0-9]{1}86)){1}'=>'Linux', 
     //'(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})'=>'Linux', 
     '[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3})'=>'Linux', 
     '(webtv)/([0-9]{1,2}\.[0-9]{1,2})'=>'WebTV', 
     'Dreamcast'=>'Dreamcast OS', 
     'GetRight'=>'Windows', 
     'go!zilla'=>'Windows', 
     'gozilla'=>'Windows', 
     'gulliver'=>'Windows', 
     'ia archiver'=>'Windows', 
     'NetPositive'=>'Windows', 
     'mass downloader'=>'Windows', 
     'microsoft'=>'Windows', 
     'offline explorer'=>'Windows', 
     'teleport'=>'Windows', 
     'web downloader'=>'Windows', 
     'webcapture'=>'Windows', 
     'webcollage'=>'Windows', 
     'webcopier'=>'Windows', 
     'webstripper'=>'Windows', 
     'webzip'=>'Windows', 
     'wget'=>'Windows', 
     'Java'=>'Unknown', 
     'flashget'=>'Windows', 

     // delete next line if the script show not the right OS 
     //'(PHP)/([0-9]{1,2}.[0-9]{1,2})'=>'PHP', 
     'MS FrontPage'=>'Windows', 
     '(msproxy)/([0-9]{1,2}.[0-9]{1,2})'=>'Windows', 
     '(msie)([0-9]{1,2}.[0-9]{1,2})'=>'Windows', 
     'libwww-perl'=>'Unix', 
     'UP.Browser'=>'Windows CE', 
     'NetAnts'=>'Windows', 
    ]; 

    // https://github.com/ahmad-sa3d/php-useragent/blob/master/core/user_agent.php 
    $arch_regex = '/\b(x86_64|x86-64|Win64|WOW64|x64|ia64|amd64|ppc64|sparc64|IRIX64)\b/ix'; 
    $arch = preg_match($arch_regex, $user_agent) ? '64' : '32'; 

    foreach ($os_array as $regex => $value) { 
     if (preg_match('{\b('.$regex.')\b}i', $user_agent)) { 
      return $value.' x'.$arch; 
     } 
    } 

    return 'Unknown'; 
}