PHP: se Internet Explorer 6, 7, 8 o 9


86

Voglio fare un condizionale in PHP per le diverse versioni di Internet Explorer sulla falsariga di:

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

Ho visto molte variazioni su codice simile, ma sto cercando qualcosa di super semplice che sia molto facile da codificare per fare un semplice se e altro e fare cose diverse.

Grazie

EDIT: Ho bisogno di questo per mostrare alcuni messaggi diversi agli utenti, quindi i condizionali CSS ecc. Non sono buoni.


4
Stai cercando di servire diversi CSS? In tal caso, considera i commenti condizionali . Meno problemi
Pekka

1
Apparentemente IE10 non supporta le istruzioni condizionali.
CharlieM

Risposte:


130

Questo è ciò di cui ho finito per usare una variazione, che controlla per IE8 e sotto:

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
}

75
Questo modello riconoscerà Internet Explorer 10 come Internet Explorer 1.
caos

2
Penso che alcune versioni di Opera corrisponderanno a questa, ma possono essere filtrate selezionando "Opera".
Liam

45
basta cambiarlo in '/(?i)msie [2-8]/'. Hai davvero bisogno di controllare ie 1 ? È stato rilasciato nel 1995 ed è stato sostituito da ie2 pochi mesi dopo.
Landon

8
L'ho cambiato in [4-8]. Gli aggiornamenti di IE stanno diventando sempre più frequenti e voglio davvero assicurarmi di non dover apportare una modifica simile durante il ciclo di vita dell'app Web su cui sto lavorando (poiché ha una durata di soli 3 anni). Se qualcuno sta navigando sul Web con IE 5 o meno, ha MOLTO più problemi rispetto alla visualizzazione della mia app web.
Adam Erstelle

2
Se aggiungi solo un punto, controllerà le versioni con numero inferiore senza verificare la versione 10, 20, ecc.'/(?i)msie [1-8]\./'
michaellindahl

85

Una versione che continuerà a funzionare sia con IE10 che con 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
  }
}

2
Non sono sicuro del motivo per cui hai usato un'istruzione switch quando sembra che un if / then sarebbe più appropriato, ma ha funzionato alla grande. E a quanto pare sei stato l'unico a leggere che l'OP voleva il supporto della versione separata.
Jake

in realtà dovevamo scegliere come target IE incluso 11 e questo ha funzionato magnificamente
code_monk

I dispositivi più recenti possono avere attributi diversi nell'agente utente di IE11, come menzionato qui: github.com/woothee/woothee-java/issues/6. Per risolvere questo problema, l'espressione regolare dovrebbe essere modificata in questo:, Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)e $version = $matches[1];dovrebbe essere modificata in $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Puoi vedere un esempio di regex qui: regexr.com/3fb4k.
jdgregson

16

Puoi controllare la variabile del server HTTP_USER_AGENT. Il programma utente trasferito da IE contiene MSIE

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

Per versioni specifiche puoi estendere la tua condizione

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

Vedi anche questa domanda correlata .


@dixus per IE11 devi farlopreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

Ecco una grande risorsa per rilevare i browser in php: http://php.net/manual/en/function.get-browser.php

Ecco uno degli esempi che sembra il più semplice:

<?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;
}
?>

Quindi più avanti nel codice potresti dire qualcosa come

$browser = get_user_browser();
if($browser == "ie"){
    //do stuff
}

1
C'è qualche motivo per impostare $ ub e poi restituirlo alla fine. Sicuramente è più efficiente (salta alcuni if ​​non necessari) restituire il nome del browser invece di impostare la variabile.
w4etwetewtwet

1
Alcuni semplici test del browser di serie, ma non esegue versioni come la richiesta ...
Jake

useragent chrome contiene safari. quindi il test sopra dovrebbe riportare Chrome come safari. l'ordine dovrebbe essere invertito. controlla prima la parola chiave chrome.
Media Joe

10

lo faccio

$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
}

Mi piace questa versione e l'ho modificata per includerla per IE11 su Windows 8.1.
Mike Kormendy

5

PHP ha una funzione chiamata get_browser () che restituirà un oggetto (o un array se lo desideri) con i dettagli sul browser degli utenti e su cosa può fare.

Un semplice sguardo mi ha dato questo codice:

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

Questo non è un modo infallibile (come si legge da HTTP_USER_AGENT , che può essere falsificato e talvolta verrà analizzato in modo sbagliato da php), ma è il più semplice che puoi trovare per quanto ne so.


2
richiede configurazioni lato server per funzionare. Non sono sicuro di quanto sia affidabile che i prodotti vengano eseguiti su server diversi
lettone

5
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
// eh, IE found
}

Questo non corrisponde alle versioni (e corrisponderà a IE 10 ecc.)
Oytun


4

Ecco una piccola funzione php che ho scritto che utilizza la regex direttamente dal codice di sniffing javascript suggerito da MSFT da questo articolo: 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;

}

3

Controllare solo MSIE non è sufficiente per rilevare IE. Hai bisogno anche di "Trident" che viene utilizzato solo in IE11. Quindi ecco la mia soluzione che ha funzionato dalle versioni dalla 8 alla 11.

$agent=strtoupper($_SERVER['HTTP_USER_AGENT']);
$isIE=(strpos($agent,'MSIE')!==false || strpos($agent,'TRIDENT')!==false);

Si prega di vedere il titolo della domanda.
Jamie Barker

2

Puoi farlo analizzando l'intestazione dell'agente utente:

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

Diffidare che questo non è molto affidabile e può essere banalmente falsificato.


Ricorda solo che User Agentpuò essere simulato.
Drudge

7
Se l'utente vuole falsificarlo User-Agent, vuole recuperare il contenuto della pagina come se quello fosse davvero il suo agente utente. Il risultato è quello che chiedevano. Nessun problema qui.
Gare di leggerezza in orbita

2

'HTTP_USER_AGENT' Contenuto dello User-Agent: intestazione della richiesta corrente, se presente. Questa è una stringa che indica l'agente utente che sta accedendo alla pagina. Un tipico esempio è: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Tra le altre cose, puoi usare questo valore con get_browser () per adattare l'output della tua pagina alle capacità del programma utente.

Quindi presumo che sarai in grado di ottenere il nome / id del browser dalla variabile $ _SERVER ["HTTP_USER_AGENT"].


1

Potresti usare qualcosa di simile per messaggi diversi o 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]-->

O usa div differenti di 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]-->

1

ma ancora utile - e funziona con IE11! ecco un altro modo breve per ottenere i browser comuni restituiti per 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;
}

Quindi questa funzione restituisce: 'safari' o 'firefox' o 'chrome', o 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.

spero che sia d'aiuto


0

Si noti il ​​caso in "Trident":

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

0

se hai Internet Explorer 11 ed è in esecuzione su un pc con touch screen, devi usare: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) invece di: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])


-1

Un approccio basato sul trend sarebbe migliore. Ecco una funzione rapida per controllare IE 8.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.