get_browser()
pour Browscap en PHPLa base de données browscap.ini recense les signatures d’un grand nombre de navigateurs Web et autres clients, et les associe à une liste de caractéristiques comme leur nom exact, et quelques capacités comme la gestion des cadres, de javascript, etc.
Démonstration de Browscap chez Browscap.org.
PHP propose une fonction native,
get_browser()
,
qui permet d’utiliser cette base de données browscap.ini.
Comme l’utilisation de cette fonction nécessite de maintenir à jour la base de données,
qui est fournie par des tiers et pas directement par PHP, nombre d’hébergeurs n’activent pas cette fonction.
Je propose donc sur cette page une fonction get_browser_local()
écrite en PHP,
mimant la fonction native get_browser()
,
et pouvant être utilisée sur n’importe quelle configuration d’hébergement PHP,
simplement en plaçant la base de données browscap.ini dans un dossier accessible.
Il suffit d’appeler la fonction get_browser_local()
avec :
$user_agent=null
(facultatif)null
,
utilise $_SERVER['HTTP_USER_AGENT']
.$return_array=false
(facultatif)$db='./browscap.ini'
(facultatif, pas dans la fonction native)$cache=false
(facultatif, pas dans la fonction native)return
Usage basique :
exemple.php <?php if (get_cfg_var('browscap')) $browser=get_browser(); //Si disponible, utilise la fonction PHP native else { require_once('php-local-browscap.php'); $browser=get_browser_local(); } print_r($browser); ?>
Pour des instructions sur l’activation de la fonction native get_browser()
de PHP,
voir ma documentation sur la configuration de PHP avec Apache2.
php-local-browscap.php <?php $browscapIni=null; //Cache $browscapPath=''; //Base de données en cache function _sortBrowscap($a,$b) { $sa=strlen($a); $sb=strlen($b); if ($sa>$sb) return -1; elseif ($sa<$sb) return 1; else return strcasecmp($a,$b); } function _lowerBrowscap($r) {return array_change_key_case($r,CASE_LOWER);} function get_browser_local($user_agent=null,$return_array=false,$db='./browscap.ini',$cache=false) {//https://alexandre.alapetite.fr/doc-alex/php-local-browscap/ //Prendre browscap.ini sur http://browscap.org/ if (($user_agent==null)&&isset($_SERVER['HTTP_USER_AGENT'])) $user_agent=$_SERVER['HTTP_USER_AGENT']; global $browscapIni; global $browscapPath; if ((!isset($browscapIni))||(!$cache)||($browscapPath!==$db)) { $browscapIni=defined('INI_SCANNER_RAW') ? parse_ini_file($db,true,INI_SCANNER_RAW) : parse_ini_file($db,true); $browscapPath=$db; uksort($browscapIni,'_sortBrowscap'); $browscapIni=array_map('_lowerBrowscap',$browscapIni); } $cap=null; foreach ($browscapIni as $key=>$value) { if (($key!='*')&&(!array_key_exists('parent',$value))) continue; $keyEreg='^'.str_replace( array('\\','.','?','*','^','$','[',']','|','(',')','+','{','}','%'), array('\\\\','\\.','.','.*','\\^','\\$','\\[','\\]','\\|','\\(','\\)','\\+','\\{','\\}','\\%'), $key).'$'; if (preg_match('%'.$keyEreg.'%i',$user_agent)) { $cap=array('browser_name_regex'=>strtolower($keyEreg),'browser_name_pattern'=>$key)+$value; $maxDeep=8; while (array_key_exists('parent',$value)&&array_key_exists($parent=$value['parent'],$browscapIni)&&(--$maxDeep>0)) $cap+=($value=$browscapIni[$parent]); break; } } if (!$cache) $browscapIni=null; return $return_array ? $cap : (object)$cap; }
À titre indicatif, pour avoir une idée de la structure de cette base de données :
browscap.ini [Mozilla 1.7] browser="Mozilla" version=1.7 majorver=1 minorver=7 css=2 frames=True iframes=True tables=True cookies=True backgroundsounds=False vbscript=False javascript=True javaapplets=True activexcontrols=False cdf=False aol=False beta=False win16=False crawler=False stripper=False wap=False netclr=False [Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.7*) Gecko/*] parent=Mozilla 1.7 platform=WinXP
browser_name_regex
Ce contenu est protégé par une licence
Creative Commons Paternité - Partage des Conditions Initiales à l’Identique 2.0 France “BY-SA (FR)”