Последней моей задачей было создание функции определения ОС, поскольку нужно было знать зашёл пользователь на сайт с windows или с другой ОС. Чтобы не изобретать велосипед, я начал гуглить, и нашёл:
<!--?php /* Author: Daniel Kassner Website: http://www.danielkassner.com */ function getOS($userAgent) { $oses = array ( 'iPhone' =--> '(iPhone)', 'Windows 3.11' => 'Win16', 'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)', 'Windows 98' => '(Windows 98)|(Win98)', 'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)', 'Windows XP' => '(Windows NT 5.1)|(Windows XP)', 'Windows 2003' => '(Windows NT 5.2)', 'Windows Vista' => '(Windows NT 6.0)|(Windows Vista)', 'Windows 7' => '(Windows NT 6.1)|(Windows 7)', 'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)', 'Windows ME' => 'Windows ME', 'Open BSD'=>'OpenBSD', 'Sun OS'=>'SunOS', 'Linux'=>'(Linux)|(X11)', 'Safari' => '(Safari)', 'Macintosh'=>'(Mac_PowerPC)|(Macintosh)', 'QNX'=>'QNX', 'BeOS'=>'BeOS', 'OS/2'=>'OS/2', 'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)' ); foreach($oses as $os=>$pattern){ if(eregi($pattern, $userAgent)) { return $os; } } return 'Unknown'; } ?> |
Но сервер ругался на функцию eregi(), открыв документацию, я узнал что функция устарела, и лучше пользоваться preg_match().
preg_match($pattern, $userAgent) |
Функция eregi() по умолчанию определяет совпадение с регулярным выражением БЕЗ учёта регистра символов, то и preg_match() пришлось изменить, добавив символ /i после закрывающего ограничителя шаблона, для регистронезависимого поиска.
preg_match("/$pattern/i", $userAgent) |
Таким образом получим код:
<!--?php function getOS($userAgent) { $oses = array ( 'iPhone' =--> '(iPhone)', 'Windows 3.11' => 'Win16', 'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)', 'Windows 98' => '(Windows 98)|(Win98)', 'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)', 'Windows XP' => '(Windows NT 5.1)|(Windows XP)', 'Windows 2003' => '(Windows NT 5.2)', 'Windows Vista' => '(Windows NT 6.0)|(Windows Vista)', 'Windows 7' => '(Windows NT 6.1)|(Windows 7)', 'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)', 'Windows ME' => 'Windows ME', 'Open BSD'=>'OpenBSD', 'Sun OS'=>'SunOS', 'Linux'=>'(Linux)|(X11)', 'Safari' => '(Safari)', 'Macintosh'=>'(Mac_PowerPC)|(Macintosh)', 'QNX'=>'QNX', 'BeOS'=>'BeOS', 'OS/2'=>'OS/2', 'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)' ); foreach($oses as $os=>$pattern){ if(preg_match("/$pattern/i", $userAgent)) { return $os; } } return 'Unknown'; } ?> |
Массив операционных систем можно дополнить, если хорошенько поискать возможные значения ОС в HTTP_USER_AGENT.
<!--?php function getOS($userAgent) { $oses = array ( // Mircrosoft Windows Operating Systems 'Windows 3.11' =--> '(Win16)', 'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)', 'Windows 98' => '(Windows 98)|(Win98)', 'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)', 'Windows 2000 Service Pack 1' => '(Windows NT 5.01)', 'Windows XP' => '(Windows NT 5.1)|(Windows XP)', 'Windows Server 2003' => '(Windows NT 5.2)', 'Windows Vista' => '(Windows NT 6.0)|(Windows Vista)', 'Windows 7' => '(Windows NT 6.1)|(Windows 7)', 'Windows 8' => '(Windows NT 6.2)|(Windows 8)', 'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)', 'Windows ME' => '(Windows ME)|(Windows 98; Win 9x 4.90 )', 'Windows CE' => '(Windows CE)', // UNIX Like Operating Systems 'Mac OS X Kodiak (beta)' => '(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' => '(Mac OS X)', 'Mac OS' => '(Mac_PowerPC)|(PowerPC)|(Macintosh)', 'Open BSD' => '(OpenBSD)', 'SunOS' => '(SunOS)', 'Solaris 11' => '(Solaris/11)|(Solaris11)', 'Solaris 10' => '((Solaris/10)|(Solaris10))', 'Solaris 9' => '((Solaris/9)|(Solaris9))', 'CentOS' => '(CentOS)', 'QNX' => '(QNX)', // Kernels 'UNIX' => '(UNIX)', // Linux Operating Systems 'Ubuntu 12.10' => '(Ubuntu/12.10)|(Ubuntu 12.10)', 'Ubuntu 12.04 LTS' => '(Ubuntu/12.04)|(Ubuntu 12.04)', 'Ubuntu 11.10' => '(Ubuntu/11.10)|(Ubuntu 11.10)', 'Ubuntu 11.04' => '(Ubuntu/11.04)|(Ubuntu 11.04)', 'Ubuntu 10.10' => '(Ubuntu/10.10)|(Ubuntu 10.10)', 'Ubuntu 10.04 LTS' => '(Ubuntu/10.04)|(Ubuntu 10.04)', 'Ubuntu 9.10' => '(Ubuntu/9.10)|(Ubuntu 9.10)', 'Ubuntu 9.04' => '(Ubuntu/9.04)|(Ubuntu 9.04)', 'Ubuntu 8.10' => '(Ubuntu/8.10)|(Ubuntu 8.10)', 'Ubuntu 8.04 LTS' => '(Ubuntu/8.04)|(Ubuntu 8.04)', 'Ubuntu 6.06 LTS' => '(Ubuntu/6.06)|(Ubuntu 6.06)', 'Red Hat Linux' => '(Red Hat)', 'Red Hat Enterprise Linux' => '(Red Hat Enterprise)', 'Fedora 17' => '(Fedora/17)|(Fedora 17)', 'Fedora 16' => '(Fedora/16)|(Fedora 16)', 'Fedora 15' => '(Fedora/15)|(Fedora 15)', 'Fedora 14' => '(Fedora/14)|(Fedora 14)', 'Chromium OS' => '(ChromiumOS)', 'Google Chrome OS' => '(ChromeOS)', // Kernel 'Linux' => '(Linux)|(X11)', // BSD Operating Systems 'OpenBSD' => '(OpenBSD)', 'FreeBSD' => '(FreeBSD)', 'NetBSD' => '(NetBSD)', // Mobile Devices 'Android' => '(Android)', 'iPod' => '(iPod)', 'iPhone' => '(iPhone)', 'iPad' => '(iPad)', //DEC Operating Systems 'OS/8' => '(OS/8)|(OS8)', 'Older DEC OS' => '(DEC)|(RSTS)|(RSTS/E)', 'WPS-8' => '(WPS-8)|(WPS8)', // BeOS Like Operating Systems 'BeOS' => '(BeOS)|(BeOS r5)', 'BeIA' => '(BeIA)', // OS/2 Operating Systems 'OS/2 2.0' => '(OS/220)|(OS/2 2.0)', 'OS/2' => '(OS/2)|(OS2)', // Search engines 'Search engine or robot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(msnbot)|(Ask Jeeves/Teoma)|(ia_archiver)' ); foreach($oses as $os=>$pattern){ if(preg_match("/$pattern/i", $userAgent)) { return $os; } } return 'Unknown'; } ?> |
Я, для определения windows у пользователя или нет, просто оставил в массиве Mircrosoft Windows Operating Systems и заменил return на true если ОС пользователя совпадает элементом массива oses, и return false — в противном случае.
function getOS($userAgent) { $oses = array ( 'Windows 3.11' => 'Win16', 'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)', 'Windows 98' => '(Windows 98)|(Win98)', 'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)', 'Windows XP' => '(Windows NT 5.1)|(Windows XP)', 'Windows 2003' => '(Windows NT 5.2)', 'Windows Vista' => '(Windows NT 6.0)|(Windows Vista)', 'Windows 7' => '(Windows NT 6.1)|(Windows 7)', 'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)', 'Windows ME' => 'Windows ME' ); foreach($oses as $os=>$pattern){ if(preg_match("/$pattern/i", $userAgent)) { return true; } } return false; } if (getOS($_SERVER['HTTP_USER_AGENT'])==true){ echo "У вас windows"; }else{ echo "У вас не windows"; } ?> |
Вот и всё. 😉 Платят за это 10$
Интересное размышление 😉
Спасибо, очень помогло, а то не мог найти как windows 8 определить
всегда пожалуйста =)
Что означает ?>
& gt; там ошибочно изображался вместо > исправил…
похоже что это вас запутало
В строке ошибка: ‘Andriod’ => ‘(Android)’, следует исправить на ‘Android’ => ‘(Android)’,
Спасибо. Исправлено! )
в gist.github.com лучше забрасывайте готовый код — там хорошо индексируется
ну и здесь само собой добавьте ссылку на гитхаб