Как определить «Google Chrome» в качестве пользовательского агента с помощью PHP?
Мне интересно узнать, является ли пользовательский агент «Chrome» на сервере с использованием PHP. Существует ли надежное регулярное выражение для разбора строки пользовательского агента из заголовка запроса?
На данный момент слишком много браузеров притворяются Chrome, чтобы использовать его популярность, а также бороться с злоупотреблениями браузером для простого совпадения для «Chrome», чтобы быть эффективными больше. Я бы порекомендовал функцию обнаружения функций в будущем, но Chrome (и WebKit / Blink в целом) печально известен тем, что лгал, чтобы также обнаруживать механизмы обнаружения, поэтому даже это не так здорово, как и раньше.
Я могу только рекомендовать оставаться на вершине вещей, сравнивая свои известные строки UA с таковыми из других браузеров через сторонние сайты и создавая шаблоны оттуда. Как вы это делаете, это полностью зависит от самих строк. Просто имейте в виду, что из-за характера браузеров и строк UA никогда не может быть «надежным» регулярным выражением для их сопоставления.
В PHP соответствующий сервер var равен $_SERVER[‘HTTP_USER_AGENT’] .
Стоит упомянуть, что если вы также хотите включить Chrome для iOS, вам также нужно будет сопоставить с «CriOS»:
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'CriOS') !== false) < // User agent is Google Chrome >
Основываясь на ответе @Adams, более точно обнаруживая Google Chrome, исключите некоторые браузеры с «Chrome» в строке пользовательского агента, используя useragentstring.com и udger.com :
if(preg_match('/(Chrome|CriOS)\//i',$_SERVER['HTTP_USER_AGENT']) && !preg_match('/(Aviator|ChromePlus|coc_|Dragon|Edge|Flock|Iron|Kinza|Maxthon|MxNitro|Nichrome|OPR|Perk|Rockmelt|Seznam|Sleipnir|Spark|UBrowser|Vivaldi|WebExplorer|YaBrowser)/i',$_SERVER['HTTP_USER_AGENT']))< // Browser might be Google Chrome >
get_browser
Attempts to determine the capabilities of the user’s browser, by looking up the browser’s information in the browscap.ini file.
Parameters
The User Agent to be analyzed. By default, the value of HTTP User-Agent header is used; however, you can alter this (i.e., look up another browser’s info) by passing this parameter.
You can bypass this parameter with a null value.
If set to true , this function will return an array instead of an object .
Return Values
The information is returned in an object or an array which will contain various data elements representing, for instance, the browser’s major and minor version numbers and ID string; true / false values for features such as frames, JavaScript, and cookies; and so forth.
The cookies value simply means that the browser itself is capable of accepting cookies and does not mean the user has enabled the browser to accept cookies or not. The only way to test if cookies are accepted is to set one with setcookie() , reload, and check for the value.
Returns false when no information can be retrieved, such as when the browscap configuration setting in php.ini has not been set.
Examples
Example #1 Listing all information about the users browser
echo $_SERVER [ ‘HTTP_USER_AGENT’ ] . «\n\n» ;
?php
$browser = get_browser ( null , true );
print_r ( $browser );
?>
The above example will output something similar to:
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] => )
Notes
Note:
In order for this to work, your browscap configuration setting in php.ini must point to the correct location of the browscap.ini file on your system.
browscap.ini is not bundled with PHP, but you may find an up-to-date » php_browscap.ini file here.
While browscap.ini contains information on many browsers, it relies on user updates to keep the database current. The format of the file is fairly self-explanatory.
User Contributed Notes 17 notes
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:
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
Since browser detection can be tricky and very slow, I compared a few packages.
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
PHP cron script to automatically update browscap.ini. It compares version numbers to determine if update is needed:
$eol = «\r\n» ; //set end of line — cron
//Find current version
$fp = fopen ( $file , «r+» );
while (( $line = stream_get_line ( $fp , 1024 * 1024 , «\n» )) !== false ) if( strpos ( $line , «Version keyword»>)=== 0 ) list( $temp , $curver ) = explode ( » keyword»>, $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 «);
?>
If you ONLY need a very fast and simple function to detect the browser name (update to May 2016):
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’ ;
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%).
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.
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 = ‘#(?’ . join ( ‘|’ , $known ) .
‘)[/ ]+(?[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 == «» )
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:
» . $ua [ ‘userAgent’ ];
print_r ( $yourbrowser );
?>
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.
// 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’ ;