Browscap

© Quesaco. Dernier ajout dans cette rubrique : 1er juin 2005.

Ce qui est simple est toujours faux. Ce qui ne l'est pas est inutilisable. Paul Valéry (Mauvaises pensées)


Découvrez les capacités du navigateur WEB
browscap.ini (browser capabilities) permet d’dentifier les capacités du navigateur WEB.

WEB / Firefox, IE, Opera, etc..

Capacités du navigateur WEB

Le fichier browscap.ini (browser capabilities) permet de dresser un inventaires des capacités du navigateur WEB utilisé sur le poste client. Pour l’utiliser directement en PHP avec get_browser (), il faut installer ce fichier sur le serveur Apache/PHP et indiquer sa présence dans le fichier de configuration de PHP (php.ini). Comment faire si ce fichier est absent de la configuration de votre hébergeur ?

Pour les néophytes en la matière, browscap.ini est un fichier au format texte - sorte de base de données - qui référence de nombreux outils de navigation (le navigateur ou browser) et les robots (crawler), en décrivant les propriétés pour chacun grâce à l’identification de l’en-tête Agent Utilisateur HTTP (ce que l’on obtient par la constante PHP : $_SERVER[’HTTP_USER_AGENT’]).

La dernière version de browscap.ini est disponible sur le site de Gary Keith qui fait un travail remarquable en maintenant ce fichier qui décrit plusieurs centaines de profils.

L’appel à la fonction PHP get_browser () permet d’identifier les capacités du navigateur client. Il est ainsi possible de détecter rapidement à la réception de la requête HTTP, quel est le navigateur, sa version, sa capacité à interpréter javascript, les applets java, mais aussi d’identifier le type de l’ordinateur bien plus finement qu’en lançant une batterie de tests en javascript plus au moins efficace.

Attention toutefois : les capacités identifiées ne signifient la disponibilité de ces capacités. L’utilisateur peut très bien avoir désactivé les cookies ou javascript dans les préférences de son navigateur.

get_browser () ne renvoie les informations correctes que si ce fichier browscap.ini fait partie de la configuration du serveur Apache/PHP. Si l’administrateur n’a pas mis à la bonne place ce fichier et le paramétrage système qui convient, get_browser () ne vous renverra que l’en-tête parfois accompagné d’un superbe message d’erreur, ce qui est de bien peu d’utilité. Autant utiliser directement $_SERVER[’HTTP_USER_AGENT’]).

Il est possible également de copier le fichier browscap.ini dans votre répertoire WEB et de le parcourir localement à l’aide de quelques fonctions PHP. En voici un exemple :

Chargement du fichier

La fonction kzo_browscap_load () charge le fichier dont le nom est donné en paramètre et renvoie un tableau contenant toutes les données lues dans l’ordre d’arrivée.

<?php 
    
function kzo_browscap_base_load ($filename) {
        if (
$handle fopen ($filename"r")) {
            while (!
feof ($handle)) {
                
$line trim (fgets($handle1024));
                if (!empty (
$line) && ereg ("^[^;].*$"$line)) {
                    
// ni ligne vide, ni commentaire
                    
if (
                    
// ligne de déclaration entre crochets []
                    
ereg ("^[[].*[]]$"$line)) {        
                        
$key substr ($line1strlen ($line) - 2);
                        while (!
feof ($handle)) {
                            
// la suite sont les capacités, 
                            
$line trim (fgets($handle1024));
                            if (empty (
$line)) {
                                
// si ligne vide, fin du définition    
                                
break;
                            } else if (
ereg ("^[^;].*$"$line)) {
                                list (
$attrib$value) = split ("="$line);
                                if (!empty (
$attrib) && !empty ($value)) {
                                    if (
eregi ("true"$value)) $value TRUE;
                                    else if (
eregi ("false"$value)) $value FALSE;
                                    if (!isset (
$browscap[$key])) {
                                        
$browscap[$key] = array ();
                                    }
                                    
$browscap[$key][$attrib] = $value;
                                }
                            }
                        } 
// end while
                    
}
                }
            } 
// end while
            
fclose ($handle);
        } else return (
FALSE);
        return (
$browscap);
    }
?>

Afficher la base des Agents Utilisateurs HTTP

Pour afficher le résultat du chargement du fichier browscap.ini au format HTML, une fonction comme kzo_browscap_base_dump () donnera satisfaction :

<?php
    
function kzo_browscap_base_dump ($browscap) {
        foreach (
$browscap as $key => $datas) {
            print (
htmlentities ($key) . " <br /><ul>");
            if (
is_array ($datas)) {
                foreach (
$datas as $attrib => $value) {
                    print (
                            
"<li>"
                        
.    htmlentities ($attrib)." = "
                        
.    (is_bool ($value
                             ? (
$value "TRUE" "FALSE") : htmlentities ($value))
                        .    
"</li>\n");
                }
            }
            print (
"</ul>\n");
        }
    }
?>

Recherche l’en-tête dans la base des Agents Utilisateurs HTTP

Une simple fonction de recherche sur les clés du tableau $browscap renvoie le résultat :

<?php
    
function kzo_browscap_search ($needle$browscap) {
        foreach (
$browscap as $key => $array) {
            if (
fnmatch ($key$needle)) {
                break;
            } 
        }
        
$result $browscap[$key];
        if (isset (
$result['parent']) && isset ($browscap[$result['parent']])) {
            foreach (
$browscap[$result['parent']] as $key => $value) {
                
$result[$key] = $value;
            }
        }
        return (
$result);
    }
?>

Afficher le résultat

Une dernière fonction pour afficher le résultat :

<?php
    
function kzo_browscap_show ($capabilities) {
        foreach (
$capabilities as $key => $value) {
            print (
"<strong>".(htmlentities ($key))."</strong> : "
                
.    (is_bool ($value) ? 
                        (
$value "TRUE" "FALSE")
                    : 
htmlentities ($value))."<br />\n");
        }
    }
?>

Exemple de code

Et enfin, un dernier exemple de code qui fait appel aux fonctions précédentes pour identifier et afficher les capacités du navigateur utilisé :

<?php
    $browscap 
= array ();            // la base browscap
    
$filename "php_browscap.ini";    // le fichier browscap
        // charge la base
    
if (!$filename && !($browscap kzo_browscap_base_load ($filename))) {
        die (
"File: ".$filename." unreadable");
    }
        
// votre USER AGENT
    
$user_agent $_SERVER['HTTP_USER_AGENT'];
        
// recherche dans la base
    
$browser_capabilities kzo_browscap_search ($user_agent$browscap);
        
// affiche le résultat
    
kzo_browscap_show ($browser_capabilities);
?>

Voici en exemple le résultat pour Firefox où l’on voit que javascript est activé :

parent : Mozilla 1.8
platform : WinXP
browser : "Mozilla"
version : 1.8
majorver : 1
minorver : 8
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 : TRUE
win16 : FALSE
crawler : FALSE
stripper : FALSE
wap : FALSE
netclr : FALSE

Il est finalement assez simple de découvrir les propriétés et les capacités du navigateur. Pour les principales :

- parent : famille du navigateur et sa génération (numéro de version) ;
- platform : environnement informatique ;
- version : version du navigateur ;
- css : version CSS supportée ;
- backgroundsounds : possibilité de fond sonore ;
- cdf : support du flux multimédia (Channel Definition Format) ;
- vbscript, javascript, javaapplets, activexcontrols : l’un ou plusieurs de ces éléments est supporté.

Vous pouvez ainsi optimiser votre site en mettant à disposition pour chaque navigateur, l’information qu’il attend dans le format qu’il peut traiter.