Par Alexandre Alapetite le 2004-05-29 ; mise à jour 2010-02-06

Implémentation autonome de get_browser() pour Browscap en PHP

La 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 Gary Keith.

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.

Télécharger le module

English

Sommaire

Quitter

Utiliser

Installation

  1. Téléchargez le module php-local-browscap (1.5) et renommez-le en php-local-browscap.php   (2010-02-06)
  2. Téléchargez php_browscap.ini chez Gary Keith et renommez-le en browscap.ini

Comment utiliser cette librairie ?

Il suffit d’appeler la fonction get_browser_local() avec :

$user_agent=null (facultatif)
La signature du navigateur à analyser. Si le paramètre est laissé à null, utilise $_SERVER['HTTP_USER_AGENT'].
$return_array=false (facultatif)
En activant ce paramètre, la fonction retourne un tableau associatif plutôt qu’un objet.
$db='./browscap.ini' (facultatif, pas dans la fonction native)
Permet de préciser le chemin de la base de données browscap.ini, sinon présume qu’elle est présente dans le répertoire courant.
$cache=false (facultatif, pas dans la fonction native)
Permet d’activer la mise en cache de la base de données, pour améliorer les performances lorsque la fonction est appelée plusieurs fois.
return
Retourne un objet (ou un tableau si demandé par le second paramètre) contenant les caractéristiques du navigateur.

Exemple

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.


Code source

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)
{//http://alexandre.alapetite.fr/doc-alex/php-local-browscap/
 //Prendre php_browscap.ini sur http://browsers.garykeith.com/downloads.asp
 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;
}

Extrait de browscap.ini

À titre indicatif, pour avoir une idée de la structure de cette base de données :

php_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

Historique

1.5 2010-02-06
Compatibilité PHP 5.3
1.4 2008-01-17
Tolérance de certaines erreurs dans la base de données
1.3 2006-09-09
Mise à jour pour le nouveau format de php_browscap.ini
Conversion des attributs en minuscule
Retourne la correspondance la plus longue plutôt que la première
1.2.2 2006-08-15
Liens mis à jour pour http://browsers.garykeith.com
1.2.1 2005-11-25
Correction d’un bogue si le navigateur n’est pas trouvé dans la base
1.2 2005-11-24
Ajout d’un système de cache
Correction d’un bogue dans le premier paramètre
1.1 2005-06-06
Détails dans l’affichage de browser_name_regex
1.0 2005-05-29
Distribution initiale

Licence

Ce contenu est protégé par une licence Creative Commons Paternité - Partage des Conditions Initiales à l’Identique 2.0 France “BY-SA (FR)” [Creative Commons License]


Commentaires

object : Voir les commentaires

http://alexandre.alapetite.fr

Retour