PHP: si Internet explorer 6, 7, 8 o 9

86

Quiero hacer un condicional en PHP para las diferentes versiones de Internet Explorer en la línea de:

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

He visto muchas variaciones en código similar, pero busco algo súper simple que sea muy fácil de codificar para hacer algo simple si y más y hacer cosas diferentes.

Gracias

EDITAR: Necesito esto para mostrar algunos mensajes diferentes a los usuarios, por lo que los condicionales de CSS, etc.no son buenos.

Cameron
fuente
4
¿Está buscando servir CSS diferente? En ese caso, considere los comentarios condicionales . Menos problemas
Pekka
1
Aparentemente, IE10 no admite declaraciones condicionales.
CharlieM

Respuestas:

130

Esto es lo que terminé usando una variación de, que verifica IE8 y más abajo:

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
fuente
75
Este patrón reconocerá Internet Explorer 10 como Internet Explorer 1.
caos
2
Creo que algunas versiones de Opera coincidirán con esto, pero se pueden filtrar verificando 'Opera'.
Liam
45
simplemente cámbielo a '/(?i)msie [2-8]/'. ¿Realmente necesitas verificar el ie 1 ? Fue lanzado en 1995 y fue reemplazado por ie2 unos meses después.
Landon
8
Lo cambié a [4-8]. Las actualizaciones de IE son cada vez más frecuentes y realmente quiero asegurarme de no tener que hacer un cambio similar durante la vida útil de la aplicación web en la que estoy trabajando (ya que solo tiene una vida útil de 3 años). Si alguien está navegando por la web con IE 5 o menos, tiene MUCHO más problemas que ver mi aplicación web.
Adam Erstelle
2
Si solo agrega un punto, verificará las versiones de números más bajos sin verificar la versión 10, 20, etc.'/(?i)msie [1-8]\./'
michaellindahl
85

Una versión que seguirá funcionando tanto con IE10 como 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
  }
}
Doug
fuente
2
No estoy seguro de por qué usó una declaración de cambio cuando parece que un if / then sería más apropiado, pero funcionó muy bien. Y aparentemente usted fue el único que leyó que el OP quería soporte de versión separada.
Jake
de hecho, tuvimos que apuntar a IE, incluido 11, y esto funcionó a la
perfección
Los dispositivos más nuevos pueden tener diferentes atributos en el agente de usuario de IE11, como se menciona aquí: github.com/woothee/woothee-java/issues/6. Para solucionarlo, la expresión regular debe cambiarse a this:, Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)y $version = $matches[1];debe cambiarse a $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Puede ver un ejemplo de la expresión regular aquí: regexr.com/3fb4k.
jdgregson
16

Puede verificar la variable de servidor HTTP_USER_AGENT. El agente de usuario transferido por IE contiene MSIE

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

Para versiones específicas puede extender su condición

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

Consulte también esta pregunta relacionada .

Narciso
fuente
@dixus para IE11 tienes que hacer estopreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK
16

Aquí hay un gran recurso para detectar navegadores en php: http://php.net/manual/en/function.get-browser.php

Este es uno de los ejemplos que parece más 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;
}
?>

Luego, más adelante en su código, podría decir algo como

$browser = get_user_browser();
if($browser == "ie"){
    //do stuff
}
Michael Jasper
fuente
1
¿Hay alguna razón para establecer $ ub y luego devolverlo al final? Seguramente es más eficiente (omite algunos if innecesarios) devolver el nombre del navegador en lugar de configurar la variable.
w4etwetewtwet
1
Algunos simples, las pruebas de navegador, pero no hace versiones como la solicitud ...
Jake
useragent chrome contiene safari. por lo que la prueba anterior debería informar Chrome como Safari. el orden debe invertirse. verifique la palabra clave chrome primero.
Joe promedio
10

hago esto

$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
fuente
Me gusta esta versión y la modifiqué para incluirla para IE11 en Windows 8.1.
Mike Kormendy
5

PHP tiene una función llamada get_browser () que devolverá un objeto (o una matriz si así lo desea) con detalles sobre el navegador de los usuarios y lo que puede hacer.

Un simple vistazo me dio este código:

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

Esta no es una forma infalible (como se lee en HTTP_USER_AGENT , que puede ser falsificado y, a veces, php lo analizará incorrectamente), pero es la más fácil que puede encontrar hasta donde yo sé.

Mike S
fuente
2
requiere configuraciones del lado del servidor para funcionar. No estoy seguro de cuán confiable es que los productos se ejecuten en diferentes servidores
letón
5
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
// eh, IE found
}
xsor
fuente
Esto no coincide con las versiones (y coincidirá con IE 10, etc.)
Oytun
4

También puede buscar en http://php.net/manual/en/function.get-browser.php de PHPget_browser();

Tal vez lo encuentre útil para más funciones.

tomsseisums
fuente
3
Ordenado. Pero requiere una configuración en su php.ini que podría ser un problema para algunos usuarios.
Jake
4

Aquí hay una pequeña función php que escribí que usa la expresión regular directamente del código de rastreo de JavaScript sugerido por MSFT de este artículo: 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
fuente
3

Verificar solo MSIE no es suficiente para detectar IE. También necesita "Trident", que solo se utiliza en IE11. Así que aquí está mi solución que funcionó en las versiones 8 a 11.

$agent=strtoupper($_SERVER['HTTP_USER_AGENT']);
$isIE=(strpos($agent,'MSIE')!==false || strpos($agent,'TRIDENT')!==false);
Markus Zeller
fuente
Consulte el título de la pregunta.
Jamie Barker
2

Puede hacer esto analizando el encabezado del agente de usuario:

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

Tenga cuidado de que esto no es muy confiable y puede falsificarse trivialmente.

Uku Loskit
fuente
Solo recuerda que User Agentse puede falsificar.
drudge
7
Si el usuario quiere suplantar User-Agent, quiere recuperar el contenido de la página como si fuera realmente su agente de usuario. El resultado es lo que pidieron. No hay problema aqui.
Lightness Races in Orbit
2

'HTTP_USER_AGENT' Contenido del User-Agent: encabezado de la solicitud actual, si hay una. Esta es una cadena que indica el agente de usuario que accede a la página. Un ejemplo típico es: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Entre otras cosas, puede usar este valor con get_browser () para adaptar la salida de su página a las capacidades del agente de usuario.

Así que supongo que podrá obtener el nombre / id del navegador de la variable $ _SERVER ["HTTP_USER_AGENT"].

arnehehe
fuente
1

Podría usar algo como esto para diferentes mensajes 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 use div diferente 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
fuente
1

pero sigue siendo útil, ¡y funciona con IE11! aquí hay otra forma corta de obtener los navegadores comunes devueltos para la clase 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;
}

Entonces, esta función devuelve: 'safari' o 'firefox' o 'chrome', o 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.

Espero eso ayude

antoni
fuente
0

Note el caso en '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
fuente
0

si tiene Internet Explorer 11 y se ejecuta en una computadora con pantalla táctil, debe usar: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) en lugar de: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])

Ivan Mendizábal Saravia
fuente
-1

Un enfoque basado en tridendos sería mejor. Aquí hay una función rápida para verificar IE 8.

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