Решил написать свой парсер user agent, который работал бы наверняка и определял не только дефолтные браузеры/системы.
function find ($needles, $haystack) {
foreach ($needles as $i)
foreach ($haystack as $j)
if (strpos ($j, $i) !== false)
return $j;
return false;
}
function cut ($str, $s) {
foreach ($s as $i) {
$p = strpos ($str, $i);
if ($p !== false)
return substr ($str, 0, $p);
}
return false;
}
preg_match_all ("/([\w\s]+)\/([\d\.]+)(?: \(([^\(\)]*)\))?( |$)/", $_SERVER['HTTP_USER_AGENT'], $agent);
for ($i = count ($agent[1]) - 1; $i >= 0; $i--)
if ($agent[1][$i] == "Version") $vkey = $i;
elseif ($i != 1) break;
if ($agent[1][$i] == "Safari" and $agent[1][$i - 1] != "Version" and $i != 2)
$i--;
if (!$vkey) $vkey = array_search ($browser, $agent[1]);
$browser = $agent[1][$i]." ".substr ($agent[2][$vkey], 0, strpos ($agent[2][$vkey], "."));
$system = explode ("; ", $agent[3][0]);
$i = find (array ("MSIE", "Opera Mobi", "Opera Mini", "Konqueror"), $system);
if ($i !== false) $browser = cut ($i, array ("/", "."));
$os = find (array ("Android", "Linux", "Windows", "Mac OS X", "BSD"), $system);
if (!isset ($os) or $os === false) $os = $system[2];
$os = cut ($os, array ("/", ".", "_", " ("));