PHP:获取浏览器名称

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2199793/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 05:28:34  来源:igfitidea点击:

PHP: get the browser name

php

提问by soupagain

How do I get the browser name using PHP? I thought this would be straightforward? All I need to do is differentiate between IE and Firefox.

如何使用 PHP 获取浏览器名称?我以为这会很简单?我需要做的就是区分 IE 和 Firefox。

回答by bobince

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

But! Don't!

但!别!

There is rarely a good reason to be sniffing user-agent at the server side. It brings a bunch of problems, including:

很少有充分的理由在服务器端嗅探用户代理。它带来了一系列问题,包括:

  • browsers and other user-agents that lie about who they are, or strip the user-agent header completely, or generally make it hard to distinguish what the real browser is from the header text. For example the above rule will also detect Opera when it's spoofing IE, and IEMobile (Windows Mobile), which you may or may not want as it is a very different browser to desktop IE.

  • if you discriminate on the user-agent at the server-side, you must return a Vary: User-Agentheader in the response, otherwise proxies may cache a version of the page and return it to other browsers that don't match. However, including this header has the side-effect of messing up caching in IE.

  • 浏览器和其他用户代理谎报他们是谁,或者完全剥离用户代理标题,或者通常很难区分真实浏览器和标题文本。例如,当 Opera 欺骗 IE 和 IEMobile (Windows Mobile) 时,上面的规则也会检测到 Opera,您可能需要也可能不需要,因为它是与桌面 IE 非常不同的浏览器。

  • 如果您在服务器端区分用户代理,则必须Vary: User-Agent在响应中返回标头,否则代理可能会缓存页面的某个版本并将其返回给其他不匹配的浏览器。但是,包含此标头会导致 IE 中的缓存混乱。

Depending on what it is you are trying to achieve, there is almost always a much better way of handling the differences between IE and other browsers at the client side, using CSS hacks, JScript or conditional comments. What is the real purpose for trying to detect IE in your case?

根据您要实现的目标,几乎总是有更好的方法来处理 IE 和客户端其他浏览器之间的差异,使用 CSS hacks、JScript 或条件注释。在您的案例中尝试检测 IE 的真正目的是什么?

回答by Sumit Bijvani

Try this code...

试试这个代码...

<?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;

?>


Output of Firefox


Firefox 的输出

Mozilla Firefox

回答by Yada

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

Prints:

印刷:

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] =>
)

回答by Sergey Kuznetsov

$_SERVER['HTTP_USER_AGENT']

$_SERVER['HTTP_USER_AGENT']

回答by T.Todua

1) Accurate detector: BrowserDetection.php(Examples)

1)准确检测器:BrowserDetection.php示例

2) primitive function :

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;
}