sky/include/UserAgent/get_os.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;
}