я юзаю эти две функции... иногда бывают глюки но в 98% случаев все отрабатывает отлично.
function str_to_os($browser_string)
    {
       $os=array(
                  "Mac68K",
                  "MacOSX",
                  "MacPPC",
                  "WinME",
                  "Win16",
                  "Win95",
                  "Win98",
                  "Win2000",
                  "WinXP",
                  "WinNT",
                  "Unix",
                  "Linux",
                  "Amiga",
                  "Win32",
                  "WinCE",
                  "FreeBSD",
                  "BeOS",
                  "OS/2"
                  );
        $os_pattern=array(
                  "68K"=>0,
                  "Mac OS X"=>1,
                  "PPC"=>2,
                  "Win 9x 4.90"=>3,
                  "Win3.11"=>4,
                  "Win95"=>5,
                  "Win98"=>6,
                  "Windows NT 5.0"=>7,
                  "Windows NT 5.1"=>8,
                  "WinNT4.0"=>9,
                  "Win16"=>4,
                  "Windows 95"=>5,
                  "Windows 98"=>6,
                  "Windows NT 4.0"=>9,
                  "Windows NT"=>9,
                  "Unix"=>10,
                  "X11"=>11,
                  "Linux"=>11,
                  "AmigaOS5.0"=>12,
                  "AmigaOS 3.1"=>12,
                  "Mac_68000"=>0,
                  "Mac_PowerPC"=>2,
                  "Windows 3.1"=>4,
                  "Win 32"=>13,
                  "Windows CE"=>14,
                  "Win3.1"=>4,
                  "Win32"=>13,
                  "Windows XP"=>8,
                  "FreeBSD"=>15,
                  "BeOS"=>16,
                  "Win2000"=>7,
                  "OS/2"=>17,
                  "SunOS"=>11,
                  "WinNT5.0"=>7,
                  "WinNT5.1"=>8,
                  "Win9x 4.90"=>3,
                  "Mac_OSX"=>1,
                  "Windows 2000"=>7,
                  "Windows ME"=>3,
                  "Windows/32"=>13,
                  "WinNT"=>9
                  );
       $found="Other";
       foreach ($os_pattern as $pattern=>$os_num)
       {
           if (stristr($browser_string,$pattern))
           {
               $found=$os[$os_num];
               break;
               }
           }
       return $found;
       }
    function identify_browser($agent)
    {
        if (eregi(\'Opera.([0-9].[0-9]{1,2})\',$agent,$version)):
            $browser_type="Opera";
            $browser_version=$version[1];
        elseif (eregi(\'MSIE.([0-9].[0-9]{1,2})\',$agent,$version)):
            $browser_type="IE";
            $browser_version=$version[1];
        elseif (eregi(\'Netscape([0-9])\',$agent,$version) or ereg(\'Netscape/([0-9])\',$agent,$version)):
            $browser_type="Netscape";
            $browser_version=$version[1];
        elseif (eregi(\'Gecko\',$agent)):
            $browser_type="Mozilla";
            if (eregi(\'rv:(.*))\',$agent,$version))
            $browser_version=$version[1];
            else
            $browser_version="";
        elseif (eregi(\'Mozilla/([0-9].[0-9]{1,2})\',$agent,$version)):
            $browser_type="Netscape";
            $browser_version=$version[1];
        elseif (eregi(\'bot\',$agent)):
            $browser_type="Bot";
            $browser_version="Other";
        else:
            $browser_type="Other";
            $browser_version="Other";
        endif;
        $browser_os=str_to_os($agent);
        return array($browser_type,$browser_version,$browser_os);
        }