web-dev-qa-db-fra.com

Puis-je détecter IE6 avec PHP?

Est-il possible d'utiliser PHP pour détecter si la page est en cours de chargement à l'aide d'IE6?

48
PHLAK

Essayez de vérifier leur agent utilisateur pour 'MSIE 6.'.

$using_ie6 = (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== FALSE);

Ceci est basé sur cette information sur l'agent utilisateur .

64
Jeremy Ruten

Vous pouvez détecter IE6 avec HTML de cette façon

<!--[if IE 6]>
// ie6 only stuff here
<![endif]-->

Voici un lien sur la façon dont cela est fait dans PHPWay Back Machine mais j'ai vu beaucoup de faux positifs dans l'analyse du $_SERVER["HTTP_USER_AGENT"] pour IE6

28
Ólafur Waage

De nombreuses réponses basées sur l'agent utilisateur sur cette page ne sont pas très fiables car Opera s'identifie souvent avec une chaîne d'agent utilisateur contenant "MSIE 6.0", telle que:

Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.51

Ceci affecte toutes les versions d'Opera 5 à 9 et même Opera 10 et peut être activé ou désactivé à partir d'Opera. Voir cette page .

Une approche courante que j'ai vue est de tester "MSIE" et contre "Opera". Par exemple,

if (preg_match('/\bmsie 6/i', $ua) && !preg_match('/\bopera/i', $ua))
  echo "We have IE6!";
15
thomasrutter

bien PHLAK ...

je pense que celui-ci est bien meilleur: P

  if(preg_match('/msie [2-6]/i',$_SERVER['HTTP_USER_AGENT'])) {
   // if IE<=6
  } else {
   //if IE>6
  }
12
marverix
9
OIS

Comme tout le monde le dit, il y aura des faux positifs en vérifiant simplement l'agent utilisateur ... alors pourquoi ne pas utiliser both, la vérification de l'agent utilisateur et un commentaire conditionnel.

par exemple...

<? if (preg_match('/\bmsie 6/i', $_SERVER['HTTP_USER_AGENT']) { ?>
  <!--[if IE 6]>
    // ie6 only stuff here
  <![endif]-->
<? } ?>

De cette façon, vous ne renverrez pas ce code inutile à la plupart des navigateurs ... mais vous serez toujours en sécurité en cas de faux positif.

6
broox

Vous pouvez , en utilisant l'en-tête HTTP User-Agent, mais je vous déconseille fortement de le faire si possible. L’en-tête User-Agent est très très difficile à analyser avec précision, et tend à créer des faux positifs avec une simple correspondance de chaîne - même en ignorant le problème des navigateurs qui prétendent être d’autres navigateurs. Par exemple, la chaîne «MSIE 6» de Jeremy correspondra à IE Mobile, qui est tellement différent de IE6 que vous ne voulez généralement pas les fusionner.

De plus, lorsque vous envoyez différents fichiers HTML à différents navigateurs, vous devez utiliser l’en-tête ‘Vary’ (qui rend les caches moins efficaces) pour éviter que les caches envoient les mauvaises pages à différents navigateurs.

Donc, si vous pouvez trouver un autre endroit pour faire la différenciation du navigateur qui est définitivement le meilleur. L'approche d'Ólafur avec des commentaires conditionnels est généralement l'approche la plus simple pour modifier les liens JavaScript et les balises HTML/CSS.

3
bobince

if(substr($_SERVER['HTTP_USER_AGENT'],0,34)=="Mozilla/4.0 (compatible; MSIE 6.0;") echo "I am stupid IE6";

IE 6 commence toujours par "Mozilla/4.0 (compatible; MSIE 6.0;" IE 7,8 comporte "MSIE 6" au milieu ...

2
Bongo

Vous pouvez l'utiliser pour de nombreux navigateurs, mais cela prend beaucoup de temps et parfois de faux positifs ...

function do_stylesheet_link() {
// Picks up appropriate css file depending on the user-agent

//  if ( stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox') ) {
//echo '<link rel="stylesheet" href="css/firefox.css" type="text/css" />'; }    

//elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Chrome') ) {
//echo '<link rel="stylesheet" href="css/chrome.css" type="text/css" />'; }

//elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {
//echo '<link rel="stylesheet" href="css/safari.css" type="text/css" />'; }

//elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Opera') ) {
//echo '<link rel="stylesheet" href="css/opera.css" type="text/css" />'; }

    if ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') )  {
echo '<link rel="stylesheet" href="css/ie6.css" type="text/css" />'; }

elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.') ) {
echo '<link rel="stylesheet" href="css/ie7.css" type="text/css" />'; }

elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 8.') ) {
echo '<link rel="stylesheet" href="css/ie8.css" type="text/css" />'; }

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

}

2
Alex
function isIE($versions=array()) {
    if (!empty($versions))
        $versions = '('.implode('|',$versions).')';
    else
        $versions = '1?\d';
    $ua = $_SERVER['HTTP_USER_AGENT'];
    $is_not_opera = false===stripos($ua, 'opera');
    return $is_not_opera && preg_match('/\bmsie '.$versions.'\./i', $ua);
}

En utilisant:

$is_ie = isIE(); //Any version
$is_ie_7 = isIE(array(7)); //IE 7
$is_old_id = isIE(array(6,7));//IE 7 and 8
1
AndreyP

Les méthodes répertoriées signalent souvent les navigateurs avec certains plug-ins (MathPlayer, par exemple; ainsi que certaines barres d'outils de programmes malveillants).

Je trouve une méthode beaucoup plus fiable est:

if( preg_match('/^Mozilla\/4\.0 \(compatible; MSIE 6/', $_SERVER['HTTP_USER_AGENT']) != 0 )
1
AJ-D

Merci les gars, j'ai fini par créer la fonction suivante et l'appeler au besoin:

// IE6 Check
function isIE() {
  $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
  if (ereg("msie 6.0", $userAgent)) {
    return true;
  } else {
    return false;
  }
}
1
PHLAK

Quelque chose de plus simple:

if(stristr(strtolower($_SERVER['HTTP_USER_AGENT']), "msie 6.0")) {
    // IE6? Aren't you out of fashion yet?
}
1
Tragedy

fil très utile. J'ai utilisé cela pour masquer la déclaration <?xml> pour IE6. En fait, IE6 ne vérifie que la première ligne du document pour le sniffing de doctype, ce qui signifie que si la chaîne <?xml> est présente, IE6 sera affiché en mode quirks quel que soit le doctype suivant la déclaration <?xml>

Je ne sais pas s'il est essentiel d'inclure un chèque d'opéra pour le moment, mais je l'ai quand même inclus.

//check if IE 6 or less
$not_lte_ie6 = true;
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
if(strpos($ua,'msie') !== FALSE) {
    if(strpos($ua,'opera') === FALSE) {
        if(preg_match('/(?i)msie [1-6]/',$ua)) $not_lte_ie6 = false;
    }
}
if ($not_lte_ie6)
    echo "<?xml version='1.0' encoding='UTF-8'?>\n";
0
niall.campbell
function isOldIE() {
    // don't support IE6 or below
    return preg_match('/MSIE [1-6]/', $_SERVER['HTTP_USER_AGENT']);
}
0
philfreo