This is not my code, buts its very slick browser and OS detection:
function detect_browser()
{
global $HTTP_USER_AGENT, $BrowserDesc, $BrowserVersion, $OS, $Browser, $OSShort;
// Browser
if(eregi("(opera) ([0-9]{1,2}.[0-9]{1,3}){0,1}",$HTTP_USER_AGENT,$match) || eregi("(opera/)([0-9]{1,2}.[0-9]{1,3}){0,1}",$HTTP_USER_AGENT,$match))
{
$BrowserDesc = "Opera"; $BrowserVersion=$match[2];
$Browser = "OP";
}
elseif(eregi("(konqueror)/([0-9]{1,2}.[0-9]{1,3})",$HTTP_USER_AGENT,$match))
{
$BrowserDesc = "Konqueror"; $BrowserVersion=$match[2];
$Browser = "KQ";
}
elseif(eregi("(lynx)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$HTTP_USER_AGENT,$match))
{
$BrowserDesc = "Lynx "; $BrowserVersion=$match[2];
$Browser = "LX";
}
elseif(eregi("(links) (([0-9]{1,2}.[0-9]{1,3})",$HTTP_USER_AGENT,$match))
{
$BrowserDesc = "Links "; $BrowserVersion=$match[2];
$Browser = "LK";
}
elseif(eregi("(msie) ([0-9]{1,2}.[0-9]{1,3})",$HTTP_USER_AGENT,$match))
{
$BrowserDesc = "MSIE "; $BrowserVersion=$match[2];
$Browser = "IE";
}
elseif(eregi("(netscape6)/(6.[0-9]{1,3})",$HTTP_USER_AGENT,$match))
{
$BrowserDesc = "Netscape "; $BrowserVersion=$match[2];
$Browser = "NN";
}
elseif(eregi("mozilla/5",$HTTP_USER_AGENT))
{
$BrowserDesc = "Netscape"; $BrowserVersion="Unknown";
$Browser = "NN";
}
elseif(eregi("(mozilla)/([0-9]{1,2}.[0-9]{1,3})",$HTTP_USER_AGENT,$match))
{
$BrowserDesc = "Netscape "; $BrowserVersion=$match[2];
$Browser = "NN";
}
elseif(eregi("w3m",$HTTP_USER_AGENT))
{
$BrowserDesc = "w3m"; $BrowserVersion="Unknown";
$Browser = "W3";
}
else{$BrowserDesc = "Unknown"; $BrowserVersion="Unknown"; $Browser = "UN";}
// System
if(eregi("linux",$HTTP_USER_AGENT))
{
$OS = "Linux";
$OSShort = "LIN";
}
elseif(eregi("win32",$HTTP_USER_AGENT))
{
$OS = "Windows";
$OSShort = "WIN";
}
elseif((eregi("(win)([0-9]{2})",$HTTP_USER_AGENT,$match)) || (eregi("(windows) ([0-9]{2})",$HTTP_USER_AGENT,$match)))
{
$OS = "Windows $match[2]";
$OSShort = "WIN";
}
elseif(eregi("(winnt)([0-9]{1,2}.[0-9]{1,2}){0,1}",$HTTP_USER_AGENT,$match))
{
$OS = "Windows NT $match[2]";
$OSShort = "WIN";
}
elseif(eregi("(windows nt)( ){0,1}([0-9]{1,2}.[0-9]{1,2}){0,1}",$HTTP_USER_AGENT,$match))
{
$OS = "Windows NT $match[3]";
$OSShort = "WIN";
}
elseif(eregi("mac",$HTTP_USER_AGENT))
{
$OS = "Macintosh";
$OSShort = "MAC";
}
elseif(eregi("(sunos) ([0-9]{1,2}.[0-9]{1,2}){0,1}",$HTTP_USER_AGENT,$match))
{
$OS = "SunOS $match[2]";
$OSShort = "SUN";
}
elseif(eregi("(beos) r([0-9]{1,2}.[0-9]{1,2}){0,1}",$HTTP_USER_AGENT,$match))
{
$OS = "BeOS $match[2]";
$OSShort = "BOS";
}
elseif(eregi("freebsd",$HTTP_USER_AGENT))
{
$OS = "FreeBSD";
$OSShort = "BSD";
}
elseif(eregi("openbsd",$HTTP_USER_AGENT))
{
$OS = "OpenBSD";
$OSShort = "BSD";
}
elseif(eregi("irix",$HTTP_USER_AGENT))
{
$OS = "IRIX";
$OSShort = "IRX";
}
elseif(eregi("os/2",$HTTP_USER_AGENT))
{
$OS = "OS/2";
$OSShort = "OS2";
}
elseif(eregi("plan9",$HTTP_USER_AGENT))
{
$OS = "Plan9";
$OSShort = "PL9";
}
elseif(eregi("unix",$HTTP_USER_AGENT) || eregi("hp-ux",$HTTP_USER_AGENT))
{
$OS = "Unix";
$OSShort = "UNX";
}
elseif(eregi("osf",$HTTP_USER_AGENT))
{
$OS = "OSF";
$OSShort = "OSF";
}
else{$OS = "Unknown"; $OSShort = "UNK";}
}