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.