PHP: получить имя браузера

Как получить имя браузера с помощью PHP? Я думал, это будет просто? Все, что мне нужно сделать, это различие между IE и Firefox.

if (strpos($_SERVER['HTTP_USER_AGENT'], '(compatible; MSIE ')!==FALSE) { ...ie specific... } 

Но! Не надо!

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

  • браузеры и другие пользовательские агенты, которые лгут о том, кто они есть, или полностью разделяют заголовок пользовательского агента или вообще трудно отличить то, что настоящий браузер от текста заголовка. Например, вышеприведенное правило также будет определять Opera, когда это подменяет IE и IEMobile (Windows Mobile), которые вы можете или не хотите, так как это совсем другой браузер для IE рабочего стола.

  • если вы различаете пользовательский агент на стороне сервера, вы должны вернуть заголовок Vary: User-Agent в ответ, в противном случае прокси могут кэшировать версию страницы и возвращать ее в другие браузеры, которые не совпадают. Однако, в том числе этот заголовок имеет побочный эффект испортить кеширование в IE.

В зависимости от того, чего вы пытаетесь достичь, почти всегда есть намного лучший способ обработки различий между IE и другими браузерами на стороне клиента, используя CSS-хаки, JScript или условные комментарии . Какова реальная цель для поиска IE в вашем случае?

Попробуйте этот код …

 <?php function getBrowser() { $u_agent = $_SERVER['HTTP_USER_AGENT']; $bname = 'Unknown'; $platform = 'Unknown'; $version= ""; //First get the platform? if (preg_match('/linux/i', $u_agent)) { $platform = 'linux'; } elseif (preg_match('/macintosh|mac os x/i', $u_agent)) { $platform = 'mac'; } elseif (preg_match('/windows|win32/i', $u_agent)) { $platform = 'windows'; } // Next get the name of the useragent yes seperately and for good reason if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent)) { $bname = 'Internet Explorer'; $ub = "MSIE"; } elseif(preg_match('/Firefox/i',$u_agent)) { $bname = 'Mozilla Firefox'; $ub = "Firefox"; } elseif(preg_match('/Chrome/i',$u_agent)) { $bname = 'Google Chrome'; $ub = "Chrome"; } elseif(preg_match('/Safari/i',$u_agent)) { $bname = 'Apple Safari'; $ub = "Safari"; } elseif(preg_match('/Opera/i',$u_agent)) { $bname = 'Opera'; $ub = "Opera"; } elseif(preg_match('/Netscape/i',$u_agent)) { $bname = 'Netscape'; $ub = "Netscape"; } // finally get the correct version number $known = array('Version', $ub, 'other'); $pattern = '#(?<browser>' . join('|', $known) . ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#'; if (!preg_match_all($pattern, $u_agent, $matches)) { // we have no matching number just continue } // see how many we have $i = count($matches['browser']); if ($i != 1) { //we will have two since we are not using 'other' argument yet //see if version is before or after the name if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){ $version= $matches['version'][0]; } else { $version= $matches['version'][1]; } } else { $version= $matches['version'][0]; } // check if we have a number if ($version==null || $version=="") {$version="?";} return array( 'userAgent' => $u_agent, 'name' => $bname, 'version' => $version, 'platform' => $platform, 'pattern' => $pattern ); } // now try it $ua=getBrowser(); $yourbrowser= "Your browser: " . $ua['name']; echo $yourbrowser; ?> 

Выход Firefox

 Mozilla Firefox 

$ _SERVER [ 'HTTP_USER_AGENT']

 <?php var_dump($_SERVER['HTTP_USER_AGENT']); var_dump(get_browser(null, true)); ?> 

Печать:

 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 Array ( [browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$ [browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9* [parent] => Firefox 0.9 [platform] => WinXP [browser] => Firefox [version] => 0.9 [majorver] => 0 [minorver] => 9 [cssversion] => 2 [frames] => 1 [iframes] => 1 [tables] => 1 [cookies] => 1 [backgroundsounds] => [vbscript] => [javascript] => 1 [javaapplets] => 1 [activexcontrols] => [cdf] => [aol] => [beta] => 1 [win16] => [crawler] => [stripper] => [wap] => [netclr] => ) 

1) Точный детектор: BrowserDetection.php ( Примеры )

2) примитивная функция:

 function get_user_browser() { $u_agent = $_SERVER['HTTP_USER_AGENT']; $ub = ''; if(preg_match('/MSIE/i',$u_agent)) { $ub = "ie"; } elseif(preg_match('/Firefox/i',$u_agent)) { $ub = "firefox"; } elseif(preg_match('/Safari/i',$u_agent)) { $ub = "safari"; } elseif(preg_match('/Chrome/i',$u_agent)) { $ub = "chrome"; } elseif(preg_match('/Flock/i',$u_agent)) { $ub = "flock"; } elseif(preg_match('/Opera/i',$u_agent)) { $ub = "opera"; } return $ub; }