2

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

<?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,并将 Chrome 正则表达式放在 2 个 Opera 正则表达式之后:

    $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
4

1 回答 1

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。

某些浏览器与其他浏览器一样部分签名的事实与历史相关。一些浏览器从其他浏览器获取他们的代码,因此被不同地识别。

于 2013-07-14T16:56:18.533 回答