PHP浏览器和os检测显示chrome而不是opera

时间:2013-07-14 16:48:24

标签: php browser browser-detection

我有一个简单的PHP脚本来检测浏览器名称和操作系统。一切顺利,除了OPERA,显示为Chrome。 这是我的代码:

<?php



    $user_agent = $_SERVER['HTTP_USER_AGENT'];

    function getOS() { 

        global $user_agent;

        $os_platform    =   'Unknown OS Platform';

        $os_array       =   array (

            '/windows nt 6.2/i'     => 'Windows 8',
            '/windows nt 6.1/i'     => 'Windows 7',
            '/windows nt 6.0/i'     => 'Windows Vista',
            '/windows nt 5.2/i'     => 'Windows Server 2003/XP x64',
            '/windows nt 5.1/i'     => 'Windows XP',
            '/windows xp/i'         => 'Windows XP',
            '/windows nt 5.0/i'     => 'Windows 2000',
            '/windows me/i'         => 'Windows ME',
            '/win98/i'              => 'Windows 98',
            '/win95/i'              => 'Windows 95',
            '/win16/i'              => 'Windows 3.11',
            '/macintosh|mac os x/i' => 'Mac OS X',
            '/mac_powerpc/i'        => 'Mac OS 9',
            '/linux/i'              => 'Linux',
            '/ubuntu/i'             => 'Ubuntu',
            '/iphone/i'             => 'iPhone',
            '/ipod/i'               => 'iPod',
            '/ipad/i'               => 'iPad',
            '/android/i'            => 'Android',
            '/blackberry/i'         => 'BlackBerry',
            '/webos/i'              => 'Mobile'

        );

        foreach ($os_array as $regex => $value) { 

            if (preg_match($regex, $user_agent)) $os_platform = $value;

        }   

        return $os_platform;

    }



    function getBrowser() {

        global $user_agent;

        $browser        =   "Unknown Browser";

        $browser_array  =   array (

            '/msie/i'       => 'Internet Explorer',
            '/firefox/i'    => 'Firefox',
            '/safari/i'     => 'Safari',
            '/chrome/i'     => 'Chrome',
            '/opera/i'      => 'Opera',
            '/netscape/i'   => 'Netscape',
            '/maxthon/i'    => 'Maxthon',
            '/konqueror/i'  => 'Konqueror',
            '/mobile/i'     => 'Handheld Browser'

        );

        foreach ($browser_array as $regex => $value) { 

            if (preg_match($regex, $user_agent)) $browser = $value;

        }

        return $browser;

    }



    $user_os        =   getOS();
    $user_browser   =   getBrowser();

    $device_details =   '<strong>Browser: </strong>' . $user_browser . '<br /><strong>Operating System: </strong>' . $user_os;

    print_r($device_details);

    echo('<br /><br /><br />' . $_SERVER['HTTP_USER_AGENT']);



?>

我通过添加/ OPR / i作为opera的另一个正则表达式来更改$ browser_array,并在2个Opera正则表达式之后放置了Chrome正则表达式:

    $browser_array  =   array (

        '/msie/i'       => 'Internet Explorer',
        '/firefox/i'    => 'Firefox',
        '/safari/i'     => 'Safari',
        '/OPR/i'        => 'Opera',
        '/opera/i'      => 'Opera',
        '/chrome/i'     => 'Chrome',
        '/netscape/i'   => 'Netscape',
        '/maxthon/i'    => 'Maxthon',
        '/konqueror/i'  => 'Konqueror',
        '/mobile/i'     => 'Handheld Browser'

    );

这是Chrome UA:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36

这是Opera UA:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36 OPR/15.0.1147.141

1 个答案:

答案 0 :(得分:1)

代码逻辑:它首先在循环中找到Opera,然后遇到“Chrome”,它也匹配。所以发现的最后结果是保留的。我建议:

foreach ($browser_array as $regex => $value) { 

    if (preg_match($regex, $user_agent) && $browser == "Unknown Browser")
        $browser = $value;

}

这样,如果已找到浏览器,则不会将其更改为新值。确保正确排序数组。

在您的情况下,此代码会首先找到Opera(匹配OPR),然后忽略Chrome(即使Opera与“Chrome”匹配)。该代码的问题在于,这次Chrome将成为问题(它将被检测为Opera)。您应该使用更具体的REGEX。

某些浏览器与其他浏览器部分签名的事实与历史相关。有些浏览器会从其他浏览器中获取代码,因此会以不同方式识别。