2

ブラウザ名とOSを検出するための簡単な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']);



?>

Opera の別の正規表現として /OPR/i を追加して $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
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 に答える