Capacités du navigateur WEB

© Christian PAULUS. Document créé le 1er juin 2005 , mis à jour le 24 février 2008.

L'idéal quand on veut être admiré, c'est d'être mort. Michel Audiard

Accueil du site > Astuces > Browscap > Capacités du navigateur WEB

WEB / Firefox, IE, Opera, etc..

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.

A noter:

Plussoyez !

Les forums sont fermés.