détection fiable des navigateurs utilisateurs avec php

essayer de détecter le navigateur d'un utilisateur avec PHP seulement, est-ce que $_SERVER['HTTP_USER_AGENT'] est un moyen fiable? Devrais-je plutôt opter pour la fonction get_browser ? lequel trouvez-vous apporte des résultats plus précis?

si cette méthode est pragmatique, est-il mal conseillé de l'utiliser pour la sortie des liens CSS pertinents, par exemple:

if(stripos($_SERVER['HTTP_USER_AGENT'],"mozilla")!==false)
   echo '<link type="text/css" href="mozilla.css" />';

j'ai remarqué cette question , cependant je tenais à préciser si cela est bon pour la détection orientée CSS.

mise à JOUR: quelque chose de vraiment suspect: j'ai essayé echo $_SERVER['HTTP_USER_AGENT']; sur IE 7 et c'est ce qu'il produit:

Mozilla / 4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)

Safari a donné quelque chose de bizarre avec "mozilla" dedans aussi. Ce qui donne?

28
demandé sur Community 2010-02-13 16:06:20

9 réponses

utilisant une méthode existante (i.e. get_browser ) est probablement mieux que d'écrire quelque chose vous-même, car il a (mieux) le soutien et sera mis à jour avec de nouvelles versions. Il peut être également utilisable bibliothèques pour obtenir l'identification navigateur de manière fiable.

décoder le $_SERVER['HTTP_USER_AGENT'] est difficile, car beaucoup de navigateurs ont des données assez similaires et ont tendance à (mis)l'utiliser pour leurs propres avantages. Mais si vous voulez vraiment décoder ces derniers, vous pouvez utiliser les informations sur cette page pour tous les identifiants d'agent disponibles. Cette page montre également que votre exemple de sortie appartient en effet à IE 7. Plus d'informations sur les champs de l'ID de l'agent lui-même peuvent être trouvées sur cette page , mais comme je l'ai déjà dit les navigateurs ont tendance à l'utiliser pour leurs propres avantages et il pourrait être dans un (légèrement) autre format.

16
répondu Veger 2010-02-13 13:28:00

vérifiez ce code, j'ai trouvé que c'est utile. Ne cochez pas Mozilla parce que la plupart des navigateurs utilisent cette chaîne comme agent utilisateur

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE)
   echo 'Internet explorer';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) //For Supporting IE 11
    echo 'Internet explorer';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== FALSE)
   echo 'Mozilla Firefox';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE)
   echo 'Google Chrome';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== FALSE)
   echo "Opera Mini";
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE)
   echo "Opera";
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') !== FALSE)
   echo "Safari";
 else
   echo 'Something else';
56
répondu Ekramul Hoque 2013-12-19 10:22:58
class Browser { 
    /** 
    Figure out what browser is used, its version and the platform it is 
    running on. 

    The following code was ported in part from JQuery v1.3.1 
    */ 
    public static function detect() { 
        $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 

        // Identify the browser. Check Opera and Safari first in case of spoof. Let Google Chrome be identified as Safari. 
        if (preg_match('/opera/', $userAgent)) { 
            $name = 'opera'; 
        } 
        elseif (preg_match('/webkit/', $userAgent)) { 
            $name = 'safari'; 
        } 
        elseif (preg_match('/msie/', $userAgent)) { 
            $name = 'msie'; 
        } 
        elseif (preg_match('/mozilla/', $userAgent) && !preg_match('/compatible/', $userAgent)) { 
            $name = 'mozilla'; 
        } 
        else { 
            $name = 'unrecognized'; 
        } 

        // What version? 
        if (preg_match('/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches)) { 
            $version = $matches[1]; 
        } 
        else { 
            $version = 'unknown'; 
        } 

        // Running on what platform? 
        if (preg_match('/linux/', $userAgent)) { 
            $platform = 'linux'; 
        } 
        elseif (preg_match('/macintosh|mac os x/', $userAgent)) { 
            $platform = 'mac'; 
        } 
        elseif (preg_match('/windows|win32/', $userAgent)) { 
            $platform = 'windows'; 
        } 
        else { 
            $platform = 'unrecognized'; 
        } 

        return array( 
            'name'      => $name, 
            'version'   => $version, 
            'platform'  => $platform, 
            'userAgent' => $userAgent 
        ); 
    } 
} 


$browser = Browser::detect(); 
6
répondu user1524615 2012-10-03 13:43:01

if stripos ($_SERVER['HTTP_USER_AGENT'],"mozilla")!= = faux)

ce n'est pas un test utile, presque tous les navigateurs s'identifient comme Mozilla.

is $_SERVER ['HTTP_USER_AGENT'] a reliable way?

Pas de.

devrais-je plutôt opter pour la fonction get_browser?

Pas de.

navigateur-renifler du côté du serveur est un jeu perdant. En dehors de toutes les questions d'essayer de parser la chaîne UA, les navigateurs qui se trouvent, les navigateurs obscurs, et la possibilité que l'en-tête n'est pas là du tout, si vous retournez le contenu de la page différente pour un navigateur différent , vous devez définir l'en-tête Vary pour inclure User-Agent , sinon la mise en cache proxies peut retourner la mauvaise version de la page au mauvais navigateur.

mais si vous ajoutez Vary: User-Agent le code de mise en cache cassé devient confus et recharge la page à chaque fois. Si vous ne pouvez pas gagner.

si vous devez renifler le navigateur, l'endroit pour le faire est du côté du client, en utilisant JavaScript et, spécifiquement dans le cas D'IE, des commentaires conditionnels. Il est chanceux que ce soit IE qui supporte les commentaires conditionnels, puisque c'est le navigateur pour lequel vous avez souvent besoin de solutions de rechange. (Voir la réponse de scunliffe pour la stratégie la plus courante.)

3
répondu bobince 2010-02-13 13:39:57

de l'Agent Utilisateur peut être truquée et son mieux de ne pas dépendre de la chaîne de l'agent utilisateur plutôt que vous pouvez utiliser CSS3 media queries si vous voulez seulement de détecter l'orientation (vous pouvez explorer le CSS de la célèbre sensible cadre de bootstrap pour vérifier la façon dont vous pouvez gérer l'orientation de la pièce à l'aide des CSS)

Voici little CSS:

    @media only screen and (max-width: 999px) {
     /* rules that only apply for canvases narrower than 1000px */
    }

    @media only screen and (device-width: 768px) and (orientation: landscape) {
    /* rules for iPad in landscape orientation */
    }

    @media only screen and (min-device-width: 320px) and (max-device-width: 480px) {
    /* iPhone, Android rules here */
    }    

plus d'informations: à propos de CSS orientation detection

ou vous peut trouver l'orientation en utilisant JavaScript:

    // Listen for orientation changes
    window.addEventListener("orientationchange", function() {
        // Announce the new orientation number
        alert(window.orientation);
    }, false);

lire la suite: A propos de detect orientation using JS

enfin si vous voulez vraiment aller avec user agent string alors ce code vous aidera beaucoup, travailler très bien presque sur chaque navigateur :

<?php
class BrowserDetection {

    private $_user_agent;
    private $_name;
    private $_version;
    private $_platform;

    private $_basic_browser = array (
       'Trident\/7.0' => 'Internet Explorer 11',
    'Beamrise' => 'Beamrise',
    'Opera' => 'Opera',
    'OPR' => 'Opera',
    'Shiira' => 'Shiira',
    'Chimera' => 'Chimera',
    'Phoenix' => 'Phoenix',
    'Firebird' => 'Firebird',
    'Camino' => 'Camino',
    'Netscape' => 'Netscape',
    'OmniWeb' => 'OmniWeb',
    'Konqueror' => 'Konqueror',
    'icab' => 'iCab',
     'Lynx' => 'Lynx',
    'Links' => 'Links',
    'hotjava' => 'HotJava',
    'amaya' => 'Amaya',
    'IBrowse' => 'IBrowse',
    'iTunes' => 'iTunes',
    'Silk' => 'Silk',
    'Dillo' => 'Dillo', 
    'Maxthon' => 'Maxthon',
    'Arora' => 'Arora',
    'Galeon' => 'Galeon',
    'Iceape' => 'Iceape',
    'Iceweasel' => 'Iceweasel',
    'Midori' => 'Midori',
    'QupZilla' => 'QupZilla',
    'Namoroka' => 'Namoroka',
    'NetSurf' => 'NetSurf',
    'BOLT' => 'BOLT',
    'EudoraWeb' => 'EudoraWeb',
    'shadowfox' => 'ShadowFox',
    'Swiftfox' => 'Swiftfox',
    'Uzbl' => 'Uzbl',
    'UCBrowser' => 'UCBrowser',
    'Kindle' => 'Kindle',
    'wOSBrowser' => 'wOSBrowser',
     'Epiphany' => 'Epiphany', 
    'SeaMonkey' => 'SeaMonkey',
    'Avant Browser' => 'Avant Browser',
    'Firefox' => 'Firefox',
    'Chrome' => 'Google Chrome',
    'MSIE' => 'Internet Explorer',
    'Internet Explorer' => 'Internet Explorer',
     'Safari' => 'Safari',
    'Mozilla' => 'Mozilla'  
    );

     private $_basic_platform = array(
        'windows' => 'Windows', 
     'iPad' => 'iPad', 
      'iPod' => 'iPod', 
    'iPhone' => 'iPhone', 
     'mac' => 'Apple', 
    'android' => 'Android', 
    'linux' => 'Linux',
    'Nokia' => 'Nokia',
     'BlackBerry' => 'BlackBerry',
    'FreeBSD' => 'FreeBSD',
     'OpenBSD' => 'OpenBSD',
    'NetBSD' => 'NetBSD',
     'UNIX' => 'UNIX',
    'DragonFly' => 'DragonFlyBSD',
    'OpenSolaris' => 'OpenSolaris',
    'SunOS' => 'SunOS', 
    'OS\/2' => 'OS/2',
    'BeOS' => 'BeOS',
    'win' => 'Windows',
    'Dillo' => 'Linux',
    'PalmOS' => 'PalmOS',
    'RebelMouse' => 'RebelMouse'   
     ); 

    function __construct($ua = '') {
        if(empty($ua)) {
           $this->_user_agent = (!empty($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:getenv('HTTP_USER_AGENT'));
        }
        else {
           $this->_user_agent = $ua;
        }
       }

    function detect() {
        $this->detectBrowser();
        $this->detectPlatform();
        return $this;
    }

    function detectBrowser() {
     foreach($this->_basic_browser as $pattern => $name) {
        if( preg_match("/".$pattern."/i",$this->_user_agent, $match)) {
            $this->_name = $name;
             // finally get the correct version number
            $known = array('Version', $pattern, 'other');
            $pattern_version = '#(?<browser>' . join('|', $known).')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
            if (!preg_match_all($pattern_version, $this->_user_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($this->_user_agent,"Version") < strripos($this->_user_agent,$pattern)){
                    @$this->_version = $matches['version'][0];
                }
                else {
                    @$this->_version = $matches['version'][1];
                }
            }
            else {
                $this->_version = $matches['version'][0];
            }
            break;
        }
       }
   }

    function detectPlatform() {
      foreach($this->_basic_platform as $key => $platform) {
            if (stripos($this->_user_agent, $key) !== false) {
                $this->_platform = $platform;
                break;
            } 
      }
    }

   function getBrowser() {
      if(!empty($this->_name)) {
           return $this->_name;
      }
   }        

   function getVersion() {
       return $this->_version;
    }

    function getPlatform() {
       if(!empty($this->_platform)) {
          return $this->_platform;
       }
    }

    function getUserAgent() {
        return $this->_user_agent;
     }

     function getInfo() {
         return "<strong>Browser Name:</strong> {$this->getBrowser()}<br/>\n" .
        "<strong>Browser Version:</strong> {$this->getVersion()}<br/>\n" .
        "<strong>Browser User Agent String:</strong> {$this->getUserAgent()}<br/>\n" .
        "<strong>Platform:</strong> {$this->getPlatform()}<br/>";
     }
}  

$obj = new BrowserDetection();

echo $obj->detect()->getInfo();

le code ci-dessus fonctionne pour moi presque sur chaque navigateur et j'espère qu'il vous aidera un peu.

2
répondu Jay 2017-05-23 10:30:59

je pense qu'il est un peu faible de compter sur l'agent utilisateur car il peut (et est) souvent simulé.

si vous voulez servir CSS juste pour IE, utilisez un commentaire conditionnel.

<link type="text/css" rel="stylesheet" href="styles.css"/><!--for all-->
<!--[if IE]>
  <link type="text/css" rel="stylesheet" href="ie_styles.css"/>
<![endif]-->

ou si vous voulez juste un pour IE6:

<!--[if IE 6]>
  <link type="text/css" rel="stylesheet" href="ie6_styles.css"/>
<![endif]-->

depuis son un commentaire son ignoré par les navigateurs... sauf IE qui le charge si le test if correspond au navigateur courant.

1
répondu scunliffe 2010-02-13 13:32:55

le vieux post apparaît toujours dans Google. get_browser () est la meilleure solution mais éditer php.ça pourrait être impossible. Selon ce post vous ne pouvez pas ini_set la propriété browscap. Reste quoi? phpbrowscap semble faire le travail. Les docs ne sont pas géniaux donc si vous ne voulez pas qu'il Auto-update( le défaut est activé), alors vous devez définir

$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL;
$bc->localFile = __DIR__ . "/php_browscap.ini";
1
répondu Robert Labrie 2017-05-23 10:30:59
Check This Code :      
   <?php     

class OS_BR{    
private $agent = "";
private $info = array();

function __construct(){
    $this->agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : NULL;
    $this->getBrowser();
    $this->getOS();
}     
function getBrowser(){     
    $browser = array("Navigator"            => "/Navigator(.*)/i",
                     "Firefox"              => "/Firefox(.*)/i",
                     "Internet Explorer"    => "/MSIE(.*)/i",
                     "Google Chrome"        => "/chrome(.*)/i",
                     "MAXTHON"              => "/MAXTHON(.*)/i",
                     "Opera"                => "/Opera(.*)/i",
                     );
    foreach($browser as $key => $value){
        if(preg_match($value, $this->agent)){
            $this->info = array_merge($this->info,array("Browser" => $key));
            $this->info = array_merge($this->info,array(
              "Version" => $this->getVersion($key, $value, $this->agent)));
            break;
        }else{
            $this->info = array_merge($this->info,array("Browser" => "UnKnown"));
            $this->info = array_merge($this->info,array("Version" => "UnKnown"));
        }
    }
    return $this->info['Browser'];
}
function getOS(){
    $OS = array("Windows"   =>   "/Windows/i",
                "Linux"     =>   "/Linux/i",
                "Unix"      =>   "/Unix/i",
                "Mac"       =>   "/Mac/i"
                );

    foreach($OS as $key => $value){
        if(preg_match($value, $this->agent)){
            $this->info = array_merge($this->info,array("Operating System" => $key));
            break;
        }
    }
    return $this->info['Operating System'];
}

function getVersion($browser, $search, $string){
    $browser = $this->info['Browser'];
    $version = "";
    $browser = strtolower($browser);
    preg_match_all($search,$string,$match);
    switch($browser){
        case "firefox": $version = str_replace("/","",$match[1][0]);
        break;

        case "internet explorer": $version = substr($match[1][0],0,4);
        break;

        case "opera": $version = str_replace("/","",substr($match[1][0],0,5));
        break;

        case "navigator": $version = substr($match[1][0],1,7);
        break;

        case "maxthon": $version = str_replace(")","",$match[1][0]);
        break;

        case "google chrome": $version = substr($match[1][0],1,10);
    }
    return $version;
}

function showInfo($switch){
    $switch = strtolower($switch);
    switch($switch){
        case "browser": return $this->info['Browser'];
        break;

        case "os": return $this->info['Operating System'];
        break;

        case "version": return $this->info['Version'];
        break;

        case "all" : return array($this->info["Version"], 
          $this->info['Operating System'], $this->info['Browser']);
        break;

        default: return "Unkonw";
        break;

    }
}
 }    


$obj = new OS_BR();

echo $obj->showInfo('browser');

echo $obj->showInfo('version');

echo $obj->showInfo('os');

echo "<pre>".print_r($obj->showInfo("all"),true)."</pre>"; 

 ?>
0
répondu Jumper Pot 2015-02-18 12:44:43

@Ekramul Hoque était sur la bonne voie mais il y a plusieurs failles dans sa réponse.

tout d'abord, je commencerais par Edge car Internet Explorer ne contient pas le terme Edge dans aucun de ses UAs.

if(strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

puis, continuer à travailler en arrière comme les versions précédentes D'IE n'ont pas utilisé le moteur Trident et ne sera donc pas contenir dans leur UA.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

nous devons cibler iOS fureteurs suivant pour que les requêtes suivantes n'interfèrent pas avec celui-ci. Tous les navigateurs iOS utilisent webkit à l'exception D'Opera Mini, qui effectue son rendu à partir d'un serveur distant au lieu de l'appareil. Cela signifie que nous pouvons cibler L'OS dans L'UA avec iOS et exclure UAs qui contiennent Opera .

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iOS') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE {
  echo '<link type="text/css" href="webkit.css" />';

ensuite, passez aux navigateurs Firefox. Tout en utilisant Firefox pour le terme de recherche fonctionnera, il ne sera identifier les navigateurs Firefox--pas Les navigateurs basés sur Firefox. Firefox contient Gecko dans son UA car Gecko est le moteur qu'il utilise, et nous pouvons donc cibler cela. En utilisant Gecko , nous pouvons identifier tous les navigateurs qui fonctionnent sur le moteur Gecko (i.e. SeaMonkey). Cependant, de nombreux navigateurs utilisent le terme like Gecko pour des raisons de compatibilité, nous devons donc nous assurer de faire correspondre Gecko et non like Gecko .

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Gecko') && !strpos($_SERVER['HTTP_USER_AGENT'], 'like Gecko') !== FALSE) {
  echo '<link type="text/css" href="moz.css" />';

passons à l'identification des navigateurs Opera. Opera utilise le Presto moteur à la fin de v12. À partir de v15, ils ont commencé à utiliser le moteur Blink comme Chrome. v12 et plus tôt contenait deux mots uniques dans L'UA que v15+ n'a pas-- Opera et Presto . Vous pouvez cibler comme ils l'ont toujours été présents ensemble. Pour v15, Opera a commencé à utiliser OPR dans L'UA.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Presto') !== FALSE) {
  echo '<link type="text/css" href="o.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'OPR') !== FALSE) {
  echo '<link type="text/css" href="normal.css" />';

ensuite, Safari. Safari utilise AppleWebKit comme moteur de rendu, mais nous ne pouvons pas simplement cibler cela parce que Chrome inclut également tant AppleWebKit que Safari dans son UA pour des raisons de compatibilité. Par conséquent, nous devons rechercher AppleWebKit et non Chrome .

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'AppleWebKit') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) {
  echo '<link type="text/css" href="webkit.css" />';

enfin, nous arrivons à Chrome. Chrome a utilisé AppleWebKit Jusqu'à v27. Avec la version v28, ils sont passés au moteur Blink. On pourrait cibler les deux moteurs, mais il faudrait beaucoup de code. Étant donné que Chrome est presque à v70 maintenant, nous allons juste chercher Chrome comme il est très peu probable que quelqu'un est encore lancer une version webkit de Chrome.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE {
  echo '<link type="text/css" href="normal.css" />';

et pour finir, votre repli/else.

} else {
  echo '<link type="text/css" href="normal.css" />';
}

maintenant, j'ai utilisé des fichiers css se référant au préfixe du fournisseur à cibler ici. N'hésitez pas à le modifier au besoin pour qu'il fasse ce dont vous avez besoin. J'espère que cela a aidé.

0
répondu Angeliss44 2018-04-20 21:42:40