201 lines
8.3 KiB
PHP
201 lines
8.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Copyright 2008-2016 Kyle Baker (Email: kyleabaker@gmail.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
/* Partly modified by Hakula */
|
|
|
|
/* Detect Operating System */
|
|
function get_os($ua) {
|
|
$version = null;
|
|
$code = null;
|
|
|
|
if (preg_match('/Windows/i', $ua) || preg_match('/WinNT/i', $ua) || preg_match('/Win32/i', $ua)) {
|
|
$title = 'Windows';
|
|
if (preg_match('/Windows NT 10.0/i', $ua) || preg_match('/Windows NT 6.4/i', $ua)) {
|
|
$version = '10';
|
|
$code = 'Windows-10';
|
|
} elseif (preg_match('/Windows NT 6.3/i', $ua)) {
|
|
$version = '8.1';
|
|
$code = 'Windows-8';
|
|
} elseif (preg_match('/Windows NT 6.2/i', $ua)) {
|
|
$version = '8';
|
|
$code = 'Windows-8';
|
|
} elseif (preg_match('/Windows NT 6.1/i', $ua)) {
|
|
$version = '7';
|
|
} elseif (preg_match('/Windows NT 6.0/i', $ua)) {
|
|
$version = 'Vista';
|
|
} elseif (preg_match('/Windows NT 5.2 x64/i', $ua)) {
|
|
$version = 'XP'; // x64 Edition very similar to Win 2003
|
|
} elseif (preg_match('/Windows NT 5.2/i', $ua)) {
|
|
$version = 'Server 2003';
|
|
} elseif (preg_match('/Windows NT 5.1/i', $ua) || preg_match('/Windows XP/i', $ua)) {
|
|
$version = 'XP';
|
|
} elseif (preg_match('/Windows NT 5.01/i', $ua)) {
|
|
$version = '2000 (SP1)';
|
|
} elseif (preg_match('/Windows NT 5.0/i', $ua) || preg_match('/Windows NT5/i', $ua) || preg_match('/Windows 2000/i', $ua)) {
|
|
$version = '2000';
|
|
} elseif (preg_match('/Windows NT 4.0/i', $ua) || preg_match('/WinNT4.0/i', $ua)) {
|
|
$version = 'NT 4.0';
|
|
} elseif (preg_match('/Windows NT 3.51/i', $ua) || preg_match('/WinNT3.51/i', $ua)) {
|
|
$version = 'NT 3.11';
|
|
} elseif (preg_match('/Windows NT/i', $ua) || preg_match('/WinNT/i', $ua)) {
|
|
$version = 'NT';
|
|
} elseif (preg_match('/Windows 3.11/i', $ua) || preg_match('/Win3.11/i', $ua) || preg_match('/Win16/i', $ua)) {
|
|
$version = '3.11';
|
|
} elseif (preg_match('/Windows 3.1/i', $ua)) {
|
|
$version = '3.1';
|
|
} elseif (preg_match('/Windows 98; Win 9x 4.90/i', $ua) || preg_match('/Win 9x 4.90/i', $ua) || preg_match('/Windows ME/i', $ua)) {
|
|
$version = 'ME';
|
|
} elseif (preg_match('/Win98/i', $ua)) {
|
|
$version = '98 SE';
|
|
} elseif (preg_match('/Windows 98/i', $ua) || preg_match('/Windows\ 4.10/i', $ua)) {
|
|
$version = '98';
|
|
} elseif (preg_match('/Windows 95/i', $ua) || preg_match('/Win95/i', $ua)) {
|
|
$version = '95';
|
|
} elseif (preg_match('/Windows CE/i', $ua)) {
|
|
$version = 'CE';
|
|
} elseif (preg_match('/WM5/i', $ua)) {
|
|
$version = 'Mobile 5';
|
|
} elseif (preg_match('/WindowsMobile/i', $ua)) {
|
|
$version = 'Mobile';
|
|
}
|
|
} elseif (preg_match('/Android/i', $ua)) {
|
|
$title = 'Android';
|
|
if (preg_match('/Android[\ |\/]?([.0-9a-zA-Z]+)/i', $ua, $regmatch)) {
|
|
$version = $regmatch[1];
|
|
}
|
|
} elseif (preg_match('/Mac/i', $ua) || preg_match('/Darwin/i', $ua)) {
|
|
$title = 'Mac OS X';
|
|
$code = 'Apple';
|
|
if (preg_match('/Mac OS X/i', $ua) || preg_match('/Mac OSX/i', $ua)) {
|
|
if (preg_match('/iPhone/i', $ua)) {
|
|
$title = 'iOS';
|
|
$version = substr($ua, strpos(strtolower($ua), strtolower('iPhone OS')) + 10);
|
|
// Parse iOS version number
|
|
$version = substr($version, 0, strpos($version, 'l') - 1);
|
|
} elseif (preg_match('/iPad/i', $ua)) {
|
|
$title = 'iOS';
|
|
$version = substr($ua, strpos(strtolower($ua), strtolower('CPU OS')) + 7);
|
|
$version = substr($version, 0, strpos($version, 'l') - 1);
|
|
} elseif (preg_match('/Mac OS X/i', $ua)) {
|
|
$version = substr($ua, strpos(strtolower($ua), strtolower('OS X')) + 5);
|
|
// Parse OS X version number
|
|
$version = substr($version, 0, strpos($version, ')'));
|
|
} else {
|
|
$version = substr($ua, strpos(strtolower($ua), strtolower('OSX')) + 4);
|
|
$version = substr($version, 0, strpos($version, ')'));
|
|
}
|
|
// Parse OS X version number
|
|
if (strpos($version, ';') > -1) {
|
|
$version = substr($version, 0, strpos($version, ';'));
|
|
}
|
|
// Beautify version format
|
|
$version = str_replace('_', '.', $version);
|
|
} elseif (preg_match('/Darwin/i', $ua)) {
|
|
$title = 'Mac OS Darwin';
|
|
} else {
|
|
$title = 'Macintosh';
|
|
}
|
|
} elseif (preg_match('/[^A-Za-z]Arch/i', $ua)) {
|
|
$title = 'Arch Linux';
|
|
$code = 'Arch-Linux';
|
|
} elseif (preg_match('/BlackBerry/i', $ua)) {
|
|
$title = 'BlackBerryOS';
|
|
} elseif (preg_match('/CentOS/i', $ua)) {
|
|
$title = 'CentOS';
|
|
if (preg_match('/.el([.0-9a-zA-Z]+).centos/i', $ua, $regmatch)) {
|
|
$version = $regmatch[1];
|
|
}
|
|
} elseif (preg_match('/CrOS/i', $ua)) {
|
|
$title = 'Google Chrome OS';
|
|
$code = 'Chrome-OS';
|
|
} elseif (preg_match('/Debian/i', $ua)) {
|
|
$title = 'Debian GNU/Linux';
|
|
$code = 'Debian';
|
|
} elseif (preg_match('/Fedora/i', $ua)) {
|
|
$title = 'Fedora';
|
|
if (preg_match('/.fc([.0-9a-zA-Z]+)/i', $ua, $regmatch)) {
|
|
$version = $regmatch[1];
|
|
}
|
|
} elseif (preg_match('/FreeBSD/i', $ua)) {
|
|
$title = 'FreeBSD';
|
|
} elseif (preg_match('/OpenBSD/i', $ua)) {
|
|
$title = 'OpenBSD';
|
|
} elseif (preg_match('/Oracle/i', $ua)) {
|
|
$title = 'Oracle';
|
|
$code = 'Oracle-Linux';
|
|
if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) {
|
|
$title .= ' Enterprise Linux';
|
|
$version = str_replace('_', '.', $regmatch[1]);
|
|
} else {
|
|
$title .= ' Linux';
|
|
}
|
|
} elseif (preg_match('/Red\ Hat/i', $ua) || preg_match('/RedHat/i', $ua)) {
|
|
$title = 'Red Hat';
|
|
$code = 'Red-Hat';
|
|
if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) {
|
|
$title .= ' Enterprise Linux';
|
|
$version = str_replace('_', '.', $regmatch[1]);
|
|
}
|
|
} elseif (preg_match('/Solaris/i', $ua) || preg_match('/SunOS/i', $ua)) {
|
|
$title = 'Solaris';
|
|
} elseif (preg_match('/Symb[ian]?[OS]?/i', $ua)) {
|
|
$title = 'SymbianOS';
|
|
if (preg_match('/Symb[ian]?[OS]?\/([.0-9a-zA-Z]+)/i', $ua, $regmatch)) {
|
|
$version = $regmatch[1];
|
|
}
|
|
} elseif (preg_match('/Ubuntu/i', $ua)) {
|
|
$title = 'Ubuntu';
|
|
if (preg_match('/Ubuntu[\/|\ ]([.0-9]+[.0-9a-zA-Z]+)/i', $ua, $regmatch)) {
|
|
$version = $regmatch[1];
|
|
}
|
|
} elseif (preg_match('/Linux/i', $ua)) {
|
|
$title = 'GNU/Linux';
|
|
$code = 'Linux';
|
|
} elseif (preg_match('/J2ME\/MIDP/i', $ua)) {
|
|
$title = 'J2ME/MIDP Device';
|
|
$code = 'Java';
|
|
}
|
|
// No OS match
|
|
else {
|
|
$title = 'Other System';
|
|
$code = 'Others';
|
|
}
|
|
// Check x64 architecture
|
|
if (preg_match('/x86_64/i', $ua)) {
|
|
// If version isn't null append 64 bit, otherwise set it to x64
|
|
$version = (is_null($version)) ? 'x64' : "$version x64";
|
|
} elseif ((preg_match('/Windows/i', $ua) || preg_match('/WinNT/i', $ua) || preg_match('/Win32/i', $ua))
|
|
&& (preg_match('/Win64/i', $ua) || preg_match('/x64/i', $ua) || preg_match('/WOW64/i', $ua))
|
|
) {
|
|
$version .= ' x64 Edition';
|
|
}
|
|
|
|
if (is_null($code)) {
|
|
$code = $title;
|
|
}
|
|
// Append version to title
|
|
if (isset($version)) {
|
|
$title .= " $version";
|
|
}
|
|
$result['code'] = $code;
|
|
$result['title'] = $title;
|
|
return $result;
|
|
}
|