Браузер и ОС сценарий обнаружения


Я понять не полагаться на информацию агента пользователя для все, что может нарушить к месту, так как она может быть подделана или скрытая и т. д., Это скорее просто дополнительная функция для чего-то.

Есть в любом случае это может быть возможно короче? Также он будет работать на несколько страниц, поэтому я желал бы знать, если это хорошо/плохо?

<?php

function getBrowserOS() { 

    $user_agent     =   $_SERVER['HTTP_USER_AGENT']; 
    $browser        =   "Unknown Browser";
    $os_platform    =   "Unknown OS Platform";

    // Get the Operating System Platform

        if (preg_match('/windows|win32/i', $user_agent)) {

            $os_platform    =   'Windows';

            if (preg_match('/windows nt 6.2/i', $user_agent)) {

                $os_platform    .=  " 8";

            } else if (preg_match('/windows nt 6.1/i', $user_agent)) {

                $os_platform    .=  " 7";

            } else if (preg_match('/windows nt 6.0/i', $user_agent)) {

                $os_platform    .=  " Vista";

            } else if (preg_match('/windows nt 5.2/i', $user_agent)) {

                $os_platform    .=  " Server 2003/XP x64";

            } else if (preg_match('/windows nt 5.1/i', $user_agent) || preg_match('/windows xp/i', $user_agent)) {

                $os_platform    .=  " XP";

            } else if (preg_match('/windows nt 5.0/i', $user_agent)) {

                $os_platform    .=  " 2000";

            } else if (preg_match('/windows me/i', $user_agent)) {

                $os_platform    .=  " ME";

            } else if (preg_match('/win98/i', $user_agent)) {

                $os_platform    .=  " 98";

            } else if (preg_match('/win95/i', $user_agent)) {

                $os_platform    .=  " 95";

            } else if (preg_match('/win16/i', $user_agent)) {

                $os_platform    .=  " 3.11";

            }

        } else if (preg_match('/macintosh|mac os x/i', $user_agent)) {

            $os_platform    =   'Mac';

            if (preg_match('/macintosh/i', $user_agent)) {

                $os_platform    .=  " OS X";

            } else if (preg_match('/mac_powerpc/i', $user_agent)) {

                $os_platform    .=  " OS 9";

            }

        } else if (preg_match('/linux/i', $user_agent)) {

            $os_platform    =   "Linux";

        }

        // Override if matched

            if (preg_match('/iphone/i', $user_agent)) {

                $os_platform    =   "iPhone";

            } else if (preg_match('/android/i', $user_agent)) {

                $os_platform    =   "Android";

            } else if (preg_match('/blackberry/i', $user_agent)) {

                $os_platform    =   "BlackBerry";

            } else if (preg_match('/webos/i', $user_agent)) {

                $os_platform    =   "Mobile";

            } else if (preg_match('/ipod/i', $user_agent)) {

                $os_platform    =   "iPod";

            } else if (preg_match('/ipad/i', $user_agent)) {

                $os_platform    =   "iPad";

            }

    // Get the Browser

        if (preg_match('/msie/i', $user_agent) && !preg_match('/opera/i', $user_agent)) { 

            $browser        =   "Internet Explorer"; 

        } else if (preg_match('/firefox/i', $user_agent)) { 

            $browser        =   "Firefox";

        } else if (preg_match('/chrome/i', $user_agent)) { 

            $browser        =   "Chrome";

        } else if (preg_match('/safari/i', $user_agent)) { 

            $browser        =   "Safari";

        } else if (preg_match('/opera/i', $user_agent)) { 

            $browser        =   "Opera";

        } else if (preg_match('/netscape/i', $user_agent)) { 

            $browser        =   "Netscape"; 

        } 

        // Override if matched

            if ($os_platform == "iPhone" || $os_platform == "Android" || $os_platform == "BlackBerry" || $os_platform == "Mobile" || $os_platform == "iPod" || $os_platform == "iPad") { 

                if (preg_match('/mobile/i', $user_agent)) {

                    $browser    =   "Handheld Browser";

                }

            }

    // Create a Data Array

        return array(
            'browser'       =>  $browser,
            'os_platform'   =>  $os_platform
        );

} 


$user_agent     =   getBrowserOS();

$device_details =   "<strong>Browser: </strong>".$user_agent['browser']."<br /><strong>Operating System: </strong>".$user_agent['os_platform']."";

print_r($device_details);

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

?>

Обновление с новым сценарием

<?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']."");

?>

Добавил еще пару браузеров и операционных систем в новой версии :)



24807
7
задан 16 ноября 2011 в 12:11 Источник Поделиться
Комментарии
1 ответ

Прежде всего, я думаю, кто-то уже написал библиотеку для этого. Я бы сделал некоторые исследования и проверить существующие библиотеки.

1, разделить код на два меньше функции: getOperatingSystem() и getBrowser().

2,

} else if (preg_match('/linux/i', $user_agent)) {    
$os_platform = "Linux";
}

// Override if matched
if (preg_match('/iphone/i', $user_agent)) {
$os_platform = "iPhone";

Второй , если нужно быть на одинаковый отступ уровня как иначе, если. Это немного сбивает с толку.

3, я бы поставил регулярных выражений и результат браузеров в ассоциативный массив и перебрать его:

$os_arr['/windows|win32/i'] = 'Windows';    
$os_arr['/windows nt 6.2/i'] = 'Windows 8';
...

foreach ($os_arr as $regexp => $value) {
if (preg_match($regexp, $user_agent)) {
$os_platform = $value;
}
}

Это не точно такой же логикой, как Ваша , если за elseif структуры, но он также может работать и он более простой. Примечание: порядок элементов в массиве имеет важное значение.

4, вместо этого:

if ($os_platform == "iPhone" || $os_platform == "Android" || $os_platform == "BlackBerry" 
|| $os_platform == "Mobile" || $os_platform == "iPod" || $os_platform == "iPad") {

установить $is_mobile флаг:

$is_mobile = false;    
if (preg_match('/iphone/i', $user_agent)) {
$os_platform = "iPhone";
$is_mobile = true;
} else if (preg_match('/android/i', $user_agent)) {
$os_platform = "Android";
$is_mobile = true;
...

if ($is_mobile && preg_match('/mobile/i', $user_agent)) {
...
}

Вы также можете сочетать его с решением ассоциативный массив:

$os_arr['/windows|win32/i']['os'] = 'Windows';    
$os_arr['/windows|win32/i']['is_mobile'] = FALSE;
$os_arr['/windows nt 6.2/i']['os'] = 'Windows 8';
$os_arr['/windows nt 6.2/i']['is_mobile'] = FALSE;

(Если вы используете его, вы должны изменить ОС и is_mobile строки в константы.)

7
ответ дан 16 ноября 2011 в 08:11 Источник Поделиться