get_browser

(PHP 4, PHP 5, PHP 7, PHP 8)

get_browserErmittelt die Fähigkeiten des Browsers eines Benutzers

Beschreibung

get_browser(?string $user_agent = null, bool $return_array = false): object|array|false

Diese Funktion versucht, die Fähigkeiten des Browsers des Benutzers zu ermitteln, indem sie die Informationen über den Browser aus der Datei browscap.ini ausliest.

Parameter-Liste

user_agent

Der User-Agent, der analysiert werden soll. Per Voreinstellung wird der Wert des HTTP User-Agent-Headers verwendet, jedoch können Sie das ändern, d. h. Informationen über einen anderen Browser nachschlagen, indem Sie diesen Parameter übergeben.

Dieser Parameter kann mit einem null-Wert umgangen werden.

return_array

Falls dieser Parameter auf true gesetzt wird, gibt die Funktion statt eines Objekts ein Array zurück.

Rückgabewerte

Die Informationen werden in einem Objekt oder Array zurückgegeben, das verschiedene Datenelemente enthält. Dazu gehören z. B. die Haupt- und Unter-Versionsnummer und Kennung des Browsers sowie true/false-Werte für dessen Fähigkeiten, z. B. Frames, JavaScript, Cookies usw.

Der Wert von cookies sagt nur etwas darüber aus, ob der Browser an sich in der Lage ist, Cookies anzunehmen, und nicht darüber, ob der Benutzer die Annahme von Cookies aktiviert hat. Die einzige Möglichkeit zu testen, ob Cookies akzeptiert werden, besteht darin, mittels setcookie() ein Cookie zu setzen, die Seite neu zu laden und dessen Wert zu überprüfen.

Gibt false zurück, wenn keine Informationen abgerufen werden können, z. B. wenn die Konfigurationseinstellung browscap in der php.ini nicht gesetzt wurde.

Beispiele

Beispiel #1 Auflistung aller Informationen über den Browser des Benutzers

<?php
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

$browser = get_browser(null, true);
print_r($browser);
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

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

Anmerkungen

Hinweis:

Damit es richtig funktioniert, muss die browscap-Einstellung Ihrer php.ini auf die richtige browscap.ini-Datei Ihres Systems zeigen.

Die browscap.ini ist nicht Bestandteil von PHP, aber eine aktuelle » php_browscap.ini bekommen Sie hier.

Da die browscap.ini Informationen zu vielen Browsern enthält, obliegt es dem Skript-Schreiber, diese Datei auf dem Laufenden zu halten. Das Format dieser Datei sollte selbsterklärend sein.

add a note add a note

User Contributed Notes 17 notes

up
54
krozinov at gmail dot com
6 years ago
As of PHP 7.0.15 and 7.1.1 and higher, get_browser() now performs much better - reportedly 100x faster.  The Changelog, bug description, and solution are here:

http://php.net/ChangeLog-7.php (search for get_browser())
https://bugs.php.net/bug.php?id=70490
https://github.com/php/php-src/pull/2242
up
71
Anonymous
8 years ago
This function is too slow for todays needs.

If you need browser / device / operating system detection, please try one of listed packages here: https://github.com/ThaDafinser/UserAgentParser
up
6
tom at tgibbons dot com
2 years ago
PHP cron script to automatically update browscap.ini. It compares version numbers to determine if update is needed:

<?php
       $eol
="\r\n";                           //set end of line - cron

      
$fileurl = "https://browscap.org/stream?q=PHP_BrowsCapINI";
      
$verurl = "https://browscap.org/version-number";
      
$file = "/path/to/browscap.ini";

      
//Find current version
      
$fp = fopen($file, "r+");
       while ((
$line = stream_get_line($fp, 1024 * 1024, "\n")) !== false) {
           if(
strpos($line,"Version=")===0) {
               list(
$temp, $curver) = explode("=",$line);
               break;
           }
       }
      
fclose($fp);
       echo(
"Current browscap.ini file version: " . $curver);
      
//Get browscap.org current version
      
$newver = file_get_contents($verurl);
       echo(
$eol . "New browscap.ini file version: " . $newver);
      
//Update if new version available
      
if($newver > $curver) {
           if(
file_put_contents($file, file_get_contents($fileurl))) {
               echo(
$eol . "browscap.ini has been updated!");
           }
           else {
               echo(
$eol . "browscap.ini update failed!");
           }
       }
       else {
           echo(
$eol . "browscap.ini is up to date!");
       }
       echo(
$eol . "End of Cron job." . $eol");
?>
up
23
Konstantin Rozinov
6 years ago
Since browser detection can be tricky and very slow, I compared a few packages.

http://thadafinser.github.io/UserAgentParserComparison/v5/index.html

https://github.com/sinergi/php-browser-detector
https://github.com/WhichBrowser/Parser-PHP
https://github.com/piwik/device-detector
http://php.net/manual/en/function.get-browser.php

Here are the results:

User Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36

Sinergi Package
---------------
Chrome 63.0.3239.84 on Windows 10.0
Took 0.0022480487823486 seconds.
---------------

WhichBrowser Package
---------------
Chrome 63 on Windows 10
Took 0.021045207977295 seconds.
---------------

Piwik Package
---------------
Chrome 63.0 on Windows 10
Took 0.079447031021118 seconds.
---------------

get_browser Package
---------------
Chrome 63.0 on Windows 10
Took 0.09611701965332 seconds.
---------------

User Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0

Sinergi Package
---------------
Firefox 57.0 on Windows 10.0
Took 0.0023159980773926 seconds.
---------------

WhichBrowser Package
---------------
Firefox 57.0 on Windows 10
Took 0.019663095474243 seconds.
---------------

Piwik Package
---------------
Firefox 57.0 on Windows 10
Took 0.079678058624268 seconds.
---------------

get_browser Package
---------------
Firefox 57.0 on Windows 10
Took 0.02236008644104 seconds.
---------------

The consistent winner (by speed, not necessarily coverage) by far is:
https://github.com/sinergi/php-browser-detector
up
40
Francesco R
8 years ago
If you ONLY need a very fast and simple function to detect the browser name (update to May 2016):

<?php

function get_browser_name($user_agent)
{
    if (
strpos($user_agent, 'Opera') || strpos($user_agent, 'OPR/')) return 'Opera';
    elseif (
strpos($user_agent, 'Edge')) return 'Edge';
    elseif (
strpos($user_agent, 'Chrome')) return 'Chrome';
    elseif (
strpos($user_agent, 'Safari')) return 'Safari';
    elseif (
strpos($user_agent, 'Firefox')) return 'Firefox';
    elseif (
strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7')) return 'Internet Explorer';
   
    return
'Other';
}

// Usage:

echo get_browser_name($_SERVER['HTTP_USER_AGENT']);

?>

This function also resolves the trouble with Edge (that contains in the user agent the string "Safari" and "Chrome"), with Chrome (contains the string "Safari") and IE11 (that do not contains 'MSIE' like all other IE versions).

Note that "strpos" is the fastest function to check a string (far better than "preg_match") and Opera + Edge + Chrome + Safari + Firefox + Internet Explorer are the most used browsers today (over 97%).
up
50
ruudrp at live dot nl
13 years ago
To my surprise I found that none of the get_browser alternatives output the correct name / version combination that I was looking for using Opera or Chrome. They either give the wrong name eg Safari when in fact it should be Chrome and if the ua string includes a version number as with the latest versions of Chrome and Opera the wrong number is reported. So I took bits and pieces from the various examples and combined them and added a check for version.

<?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'] . " " . $ua['version'] . " on " .$ua['platform'] . " reports: <br >" . $ua['userAgent'];
print_r($yourbrowser);
?>
up
16
Anonymous
5 years ago
Follow up to Francesco R's post from 2016.

His function works for most human traffic; added a few lines to cover the most common bot traffic. Also fixed issue with function failing to detect strings at position 0 due to strpos behavior.

<?php
// Function written and tested December, 2018
function get_browser_name($user_agent)
{
       
// Make case insensitive.
       
$t = strtolower($user_agent);

       
// If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
        // "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
        //     http://php.net/manual/en/function.strpos.php
       
$t = " " . $t;

       
// Humans / Regular Users     
       
if     (strpos($t, 'opera'     ) || strpos($t, 'opr/')     ) return 'Opera'            ;
        elseif (
strpos($t, 'edge'      )                           ) return 'Edge'             ;
        elseif (
strpos($t, 'chrome'    )                           ) return 'Chrome'           ;
        elseif (
strpos($t, 'safari'    )                           ) return 'Safari'           ;
        elseif (
strpos($t, 'firefox'   )                           ) return 'Firefox'          ;
        elseif (
strpos($t, 'msie'      ) || strpos($t, 'trident/7')) return 'Internet Explorer';

       
// Search Engines 
       
elseif (strpos($t, 'google'    )                           ) return '[Bot] Googlebot'   ;
        elseif (
strpos($t, 'bing'      )                           ) return '[Bot] Bingbot'     ;
        elseif (
strpos($t, 'slurp'     )                           ) return '[Bot] Yahoo! Slurp';
        elseif (
strpos($t, 'duckduckgo')                           ) return '[Bot] DuckDuckBot' ;
        elseif (
strpos($t, 'baidu'     )                           ) return '[Bot] Baidu'       ;
        elseif (
strpos($t, 'yandex'    )                           ) return '[Bot] Yandex'      ;
        elseif (
strpos($t, 'sogou'     )                           ) return '[Bot] Sogou'       ;
        elseif (
strpos($t, 'exabot'    )                           ) return '[Bot] Exabot'      ;
        elseif (
strpos($t, 'msn'       )                           ) return '[Bot] MSN'         ;

       
// Common Tools and Bots
       
elseif (strpos($t, 'mj12bot'   )                           ) return '[Bot] Majestic'     ;
        elseif (
strpos($t, 'ahrefs'    )                           ) return '[Bot] Ahrefs'       ;
        elseif (
strpos($t, 'semrush'   )                           ) return '[Bot] SEMRush'      ;
        elseif (
strpos($t, 'rogerbot'  ) || strpos($t, 'dotbot')   ) return '[Bot] Moz or OpenSiteExplorer';
        elseif (
strpos($t, 'frog'      ) || strpos($t, 'screaming')) return '[Bot] Screaming Frog';
       
       
// Miscellaneous
       
elseif (strpos($t, 'facebook'  )                           ) return '[Bot] Facebook'     ;
        elseif (
strpos($t, 'pinterest' )                           ) return '[Bot] Pinterest'    ;
       
       
// Check for strings commonly used in bot user agents  
       
elseif (strpos($t, 'crawler' ) || strpos($t, 'api'    ) ||
               
strpos($t, 'spider'  ) || strpos($t, 'http'   ) ||
               
strpos($t, 'bot'     ) || strpos($t, 'archive') ||
               
strpos($t, 'info'    ) || strpos($t, 'data'   )    ) return '[Bot] Other'   ;
       
        return
'Other (Unknown)';
}
?>
Post with more depth here:
https://www.256kilobytes.com/content/show/1922/how-to-parse-a-user-agent-in-php-with-minimal-effort
up
17
The Digital Orchard
7 years ago
Good news! The latest version of PHP has a performance fix for this function. It's reportedly now 100x faster. See the ChangeLog for specifics.
up
5
Jeff Williams
6 years ago
To automatically update your browscap.ini file on linux servers, you can use this simple shell script:

wget -O /etc/browscap.ini "http://browscap.org/stream?q=Full_PHP_BrowsCapINI"
chmod 664 /etc/browscap.ini

You can put it in the weekly cron job folder usually located in /etc/cron.weekly just don't forget to make the script executable (chmod 775 scriptname).
up
7
shashank
9 years ago
As ruudrp had given the code http://php.net/manual/en/function.get-browser.php#101125, I have added code for Internet Explorer 11

<?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('/Trident/i',$u_agent))
    {
// this condition is for IE11
       
$bname = 'Internet Explorer';
       
$ub = "rv";
    }
    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
    // Added "|:"
   
$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'] . " " . $ua['version'] . " on " .$ua['platform'] . " reports: <br >" . $ua['userAgent'];
print_r($yourbrowser);
?>
up
8
tim at digicol dot de
10 years ago
Be aware that loading php_browscap.ini via the browscap php.ini setting may consume a non-trivial amount of memory. Current versions are several MB in size (even the “lite” one) and can eat tens of MB of RAM in each PHP process. This happens even if you never call get_browser() since php_browscap.ini is loaded when PHP is starting up.

Make sure to leave the browscap php.ini setting empty if you don’t use get_browser() – maybe you only call it only from PHP Web pages, but not from PHP CLI code.

I’d recommend comparing your processes’ memory consumption with and without php_browscap.ini being loaded. If necesseray, consider creating your own stripped-down copy of php_browscap.ini with just the browsers that are important to you.
up
6
Anonymous
13 years ago
For those of you using this function to target MSIE, a better idea maybe to use MSIE specific conditional comments. More info: <http://msdn.microsoft.com/en-us/library/ms537512%28VS.85%29.aspx>.

For example to indicate your disregard for users of MSIE 6 or earlier:

<!--[if lt IE 7]>It appears that you are using a <em>very</em> old version of MS Internet Explorer (MSIE). If you seriously want to continue to use MSIE, at least <a href="http://www.microsoft.com/windows/internet-explorer/">upgrade</a>.<![endif]-->
up
2
mike at mike-griffiths dot co dot uk
17 years ago
You should not rely on just this for cross-browser compatibility issues.  Good practice would be to include HTML if-statements for IE stylesheets as well as dynamically checking the browser type.
up
2
max at phpexpert dot de
20 years ago
Be aware of the fact that this function shows what a specific browser might be able to show, but NOT what the user has turned on/off.

So maybe this function tells you that the browser is abel to to javascript even when javascript is turned off by the user.
up
0
jeremie dot legrand at komori-chambon dot fr
8 years ago
Be careful if you use the "Full" Browscap INI file in your php.ini config: I wondered why each Apache thread took 350MB RAM on my server until I changed the "Full" version by the "Lite" one (45MB to 0.7MB)

Now, each thread takes only 16MB...
So if it is enough for you, use the Lite version!
up
-2
zed
8 years ago
To complete Francesco R, I added the version of the navigator :

function getNavigateur($user_agent)
    {

        if(empty($user_agent)) {
            return array('nav' => 'NC', 'name' => 'NC', 'version' => 'NC');
        }

        $content_nav['name'] = 'Unknown';

        if (strpos($user_agent, 'Opera') || strpos($user_agent, 'OPR/')) {

            $content_nav['name'] = 'Opera';

            if (strpos($user_agent, 'OPR/')) {
                $content_nav['reel_name'] = 'OPR/';
            } else {
                $content_nav['reel_name'] = 'Opera';
            }

        }
        elseif (strpos($user_agent, 'Edge')) {
            $content_nav['name'] = $content_nav['reel_name'] = 'Edge';
        }
        elseif (strpos($user_agent, 'Chrome')) $content_nav['name'] = $content_nav['reel_name'] = 'Chrome';
        elseif (strpos($user_agent, 'Safari')) $content_nav['name'] = $content_nav['reel_name'] = 'Safari';
        elseif (strpos($user_agent, 'Firefox')) $content_nav['name'] = $content_nav['reel_name'] = 'Firefox';
        elseif (strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7') || strpos($user_agent, 'Trident/7.0; rv:')) {
            $content_nav['name'] = 'Internet Explorer';

            if (strpos($user_agent, 'Trident/7.0; rv:')) {
                $content_nav['reel_name'] = 'Trident/7.0; rv:';
            } elseif (strpos($user_agent, 'Trident/7')) {
                $content_nav['reel_name'] = 'Trident/7';
            } else {
                $content_nav['reel_name'] = 'Opera';
            }

        }

        $pattern = '#' . $content_nav['reel_name'] . '\/*([0-9\.]*)#';

        $matches = array();

        if(preg_match($pattern, $user_agent, $matches)) {

            $content_nav['version'] = $matches[1];
            return $content_nav;

        }

        return array('name' => $content_nav['name'], 'version' => 'Inconnu');
    }
up
-7
p2 at eduardoruiz dot es
8 years ago
BE CAREFUL WITH THIS FUNCTION!!
This function uses a lot of CPU and RAM on the whole server resources.
Perhaps if you use this function a few times then no problem, but NOT if you use at any page request, or once per session.

Also, this function doesn't work correctly and may returns wrong values, wildcards or empty, so it's not very useful for web statistics.

The best way is to use preg_match for detect browser/platform.
To Top