PHP: si Internet Explorer 6, 7, 8 ou 9

86

Je souhaite faire un conditionnel en PHP pour les différentes versions d'Internet Explorer du type:

if($browser == ie6){ //do this} elseif($browser == ie7) { //dothis } elseif...

J'ai vu de nombreuses variantes de code similaire, mais à la recherche de quelque chose de super simple qui est très facile à coder pour faire des choses simples si et autrement et faire des choses différentes.

Merci

EDIT: J'ai besoin de cela pour montrer différents messages aux utilisateurs, donc les conditions CSS, etc. ne sont pas bonnes.

Cameron
la source
4
Cherchez-vous à servir des CSS différents? Dans ce cas, tenez compte des commentaires conditionnels . Moins de tracas
Pekka
1
Apparemment, IE10 ne prend pas en charge les instructions conditionnelles.
CharlieM

Réponses:

130

C'est ce que j'ai fini par utiliser une variante de, qui vérifie IE8 et ci-dessous:

if (preg_match('/MSIE\s(?P<v>\d+)/i', @$_SERVER['HTTP_USER_AGENT'], $B) && $B['v'] <= 8) {
    // Browsers IE 8 and below
} else {
    // All other browsers
}
Cameron
la source
75
Ce modèle reconnaîtra Internet Explorer 10 comme Internet Explorer 1.
chaos
2
Je pense que certaines versions d'Opera correspondent à cela, mais elles peuvent être filtrées en vérifiant "Opera".
Liam
45
changez-le simplement en '/(?i)msie [2-8]/'. Avez-vous vraiment besoin de vérifier ie 1 ? Il a été publié en 1995 et a été remplacé par ie2 quelques mois plus tard.
Landon
8
Je l'ai changé en [4-8]. Les mises à jour d'IE sont de plus en plus fréquentes et je veux vraiment m'assurer de ne pas avoir à faire un changement similaire pendant la durée de vie de l'application Web sur laquelle je travaille (car elle n'a qu'une durée de vie de 3 ans). Si quelqu'un navigue sur le Web avec IE 5 ou moins, il a BEAUCOUP plus de problèmes que de visualiser mon application Web.
Adam Erstelle
2
Si vous ajoutez simplement un point, il vérifiera les versions à numéro inférieur sans vérifier la version 10, 20, etc.'/(?i)msie [1-8]\./'
michaellindahl
85

Une version qui continuera à fonctionner avec IE10 et IE11:

preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
if(count($matches)<2){
  preg_match('/Trident\/\d{1,2}.\d{1,2}; rv:([0-9]*)/', $_SERVER['HTTP_USER_AGENT'], $matches);
}

if (count($matches)>1){
  //Then we're using IE
  $version = $matches[1];

  switch(true){
    case ($version<=8):
      //IE 8 or under!
      break;

    case ($version==9 || $version==10):
      //IE9 & IE10!
      break;

    case ($version==11):
      //Version 11!
      break;

    default:
      //You get the idea
  }
}
Doug
la source
2
Je ne sais pas pourquoi vous avez utilisé une instruction switch alors qu'il semble qu'un si / alors serait plus approprié, mais cela a très bien fonctionné. Et apparemment, vous étiez le seul à avoir lu que l'OP voulait un support de version distinct.
Jake
nous devions en fait cibler IE dont 11 et cela a fonctionné à merveille
code_monk
Les appareils plus récents peuvent avoir des attributs différents dans l'agent utilisateur IE11, comme mentionné ici: github.com/woothee/woothee-java/issues/6. Pour résoudre ce problème, l'expression régulière doit être remplacée par ceci: Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)et $version = $matches[1];doit être remplacée par $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Vous pouvez voir un exemple de regex ici: regexr.com/3fb4k.
jdgregson
16

Vous pouvez vérifier la variable serveur HTTP_USER_AGENT. L'agent utilisateur transféré par IE contient MSIE

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { ... }

Pour des versions spécifiques, vous pouvez prolonger votre condition

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== false) { ... }

Voir également cette question connexe .

Daff
la source
@dixus pour IE11, vous devez le fairepreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK
16

Voici une excellente ressource pour détecter les navigateurs en php: http://php.net/manual/en/function.get-browser.php

Voici l'un des exemples qui semble le plus simple:

<?php
function get_user_browser()
{
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $ub = '';
    if(preg_match('/MSIE/i',$u_agent))
    {
        $ub = "ie";
    }
    elseif(preg_match('/Firefox/i',$u_agent))
    {
        $ub = "firefox";
    }
    elseif(preg_match('/Safari/i',$u_agent))
    {
        $ub = "safari";
    }
    elseif(preg_match('/Chrome/i',$u_agent))
    {
        $ub = "chrome";
    }
    elseif(preg_match('/Flock/i',$u_agent))
    {
        $ub = "flock";
    }
    elseif(preg_match('/Opera/i',$u_agent))
    {
        $ub = "opera";
    }

    return $ub;
}
?>

Ensuite, plus tard dans votre code, vous pourriez dire quelque chose comme

$browser = get_user_browser();
if($browser == "ie"){
    //do stuff
}
Michael Jasper
la source
1
Y a-t-il une raison de définir $ ub, puis de le renvoyer à la fin. Il est sûrement plus efficace (évite certains if inutiles) de renvoyer le nom du navigateur au lieu de définir la variable.
w4etwetewtwet
1
Quelques tests de navigateur simples, mais il ne fait pas de versions comme la demande ...
Jake
chrome useragent contient safari. donc le test ci-dessus devrait signaler Chrome comme safari. l'ordre doit être inversé. vérifiez d'abord le mot-clé chrome.
Moyenne de Joe
10

je fais ça

$u = $_SERVER['HTTP_USER_AGENT'];

$isIE7  = (bool)preg_match('/msie 7./i', $u );
$isIE8  = (bool)preg_match('/msie 8./i', $u );
$isIE9  = (bool)preg_match('/msie 9./i', $u );
$isIE10 = (bool)preg_match('/msie 10./i', $u );

if ($isIE9) {
    //do ie9 stuff
}
Vince Lowe
la source
J'aime cette version et je l'ai modifiée pour l'inclure pour IE11 sur Windows 8.1.
Mike Kormendy
5

PHP a une fonction appelée get_browser () qui retournera un objet (ou un tableau si vous le souhaitez) avec des détails sur le navigateur des utilisateurs et ce qu'il peut faire.

Un simple coup d'œil m'a donné ce code:

$browser = get_browser( null, true );
if( $browser['name'] == "Firefox" )
    if( $browser['majorversion'] == 4 )
        echo "You're using Firefox version 4!";

Ce n'est pas un moyen infaillible (comme il se lit à partir de HTTP_USER_AGENT , qui peut être usurpé, et sera parfois mal analysé par php), mais c'est le plus simple que vous puissiez trouver pour autant que je sache.

Mike S
la source
2
nécessite des configurations côté serveur pour fonctionner. Je ne suis pas sûr de la fiabilité de l'exécution des produits sur différents serveurs
letton
5
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
// eh, IE found
}
xsor
la source
Cela ne correspond pas aux versions (et correspondra à IE 10, etc.)
Oytun
4

Vous pouvez également consulter le http://php.net/manual/en/function.get-browser.php de PHPget_browser();

Peut-être que vous le trouverez utile pour plus de fonctionnalités.

tomsseisums
la source
3
Soigné. Mais cela nécessite un paramètre dans votre php.ini, ce qui pourrait être un problème pour certains utilisateurs.
Jake
4

Voici une petite fonction php que j'ai écrite qui utilise l'expression régulière directement à partir du code de reniflage javascript suggéré par MSFT dans cet article: http://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx

/**
* Returns the version of Internet Explorer or false
*/
function isIE(){

    $isIE = preg_match("/MSIE ([0-9]{1,}[\.0-9]{0,})/",$_SERVER['HTTP_USER_AGENT'],$version);
    if($isIE){
        return $version[1];
    }
    return $isIE;

}
minorgod
la source
3

Vérifier uniquement MSIE ne suffit pas pour détecter IE. Vous avez également besoin de "Trident" qui n'est utilisé que dans IE11. Voici donc ma solution qui fonctionnait sur les versions 8 à 11.

$agent=strtoupper($_SERVER['HTTP_USER_AGENT']);
$isIE=(strpos($agent,'MSIE')!==false || strpos($agent,'TRIDENT')!==false);
Markus Zeller
la source
Veuillez consulter le titre de la question.
Jamie Barker
2

Vous pouvez le faire en analysant l'en-tête user-agent:

http://php.about.com/od/learnphp/p/http_user_agent.htm

Méfiez-vous du fait que cela n'est pas très fiable et peut être usurpé de manière triviale.

Uku Loskit
la source
N'oubliez pas que le User Agentpeut être truqué.
drudge
7
Si l'utilisateur veut usurper son User-Agent, il souhaite récupérer le contenu de la page comme s'il s'agissait vraiment de son user-agent. Le résultat est ce qu'ils ont demandé. Aucun problème ici.
Courses de légèreté en orbite
2

'HTTP_USER_AGENT' Contenu du User-Agent: en-tête de la requête en cours, s'il y en a un. Il s'agit d'une chaîne indiquant que l'agent utilisateur accède à la page. Un exemple typique est: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Entre autres choses, vous pouvez utiliser cette valeur avec get_browser () pour adapter la sortie de votre page aux capacités de l'agent utilisateur.

Je suppose donc que vous serez en mesure d'obtenir le nom / identifiant du navigateur à partir de la variable $ _SERVER ["HTTP_USER_AGENT"].

arnehehe
la source
1

Vous pouvez utiliser quelque chose comme ça pour différents messages ou div / css

<!--[if IE 6]>
<style type="text/css">
div.ie6 { display:block; }
</style>
<![endif]-->

<!--[if IE 7]>
<style type="text/css">
div.ie7 { display:block; }
</style>
<![endif]-->

<!--[if IE 8]>
<style type="text/css">
div.ie8 { display:block; }
</style>
<![endif]-->

<!--[if IE 9]>
message1
<![endif]-->

<!--[if !IE 6]>
message2
<![endif]-->

<!--[if lt IE 8]>
message3
<![endif]-->

OU utilisez un div différent de css

<!--[if lte IE 8]>
<style type="text/css">
div.lteie8 { display:block; }
</style>
<![endif]-->

<!--[if gt IE 6]>
<style type="text/css">
div.gtie6 { display:block; }
</style>
<![endif]-->

<!--[if gte IE 6]>
<style type="text/css">
div.gteie6 { display:block; }
</style>
<![endif]-->
Enrico Tempesti
la source
1

mais toujours utile - et fonctionne avec IE11! voici un autre moyen rapide de récupérer les navigateurs courants pour la classe css:

function get_browser()
{
    $browser = '';
    $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
    if (preg_match('~(?:msie ?|trident.+?; ?rv: ?)(\d+)~', $ua, $matches)) $browser = 'ie ie'.$matches[1];
    elseif (preg_match('~(safari|chrome|firefox)~', $ua, $matches)) $browser = $matches[1];

    return $browser;
}

Donc cette fonction renvoie: 'safari' ou 'firefox' ou 'chrome', ou 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.

J'espère que cela aide

Antoni
la source
0

Notez le cas dans 'Trident':

if (isset($_SERVER['HTTP_USER_AGENT']) &&
    ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false)) {   
     // IE is here :-(
    }
Vlado
la source
0

si vous avez Internet Explorer 11 et qu'il fonctionne sur un PC à écran tactile, vous devez utiliser: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) au lieu de: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])

Ivan Mendizabal Saravia
la source
-1

Une approche basée sur les tendances serait préférable. Voici une fonction rapide pour vérifier IE 8.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
sajin tm
la source