PHP: Se o Internet Explorer 6, 7, 8 ou 9

86

Quero fazer uma condicional em PHP para as diferentes versões do Internet Explorer ao longo das linhas de:

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

Eu vi muitas variações de código semelhante, mas procurando por algo super simples que seja muito fácil de codificar para fazer algum if e else simples e fazer coisas diferentes.

obrigado

EDIT: Eu preciso disso para mostrar algumas mensagens diferentes aos usuários, portanto, as condicionais CSS, etc., não são boas.

Cameron
fonte
4
Você está procurando servir CSS diferente? Nesse caso, considere os comentários condicionais . Menos incômodo
Pekka
1
Aparentemente, o IE10 não oferece suporte a declarações condicionais.
CharlieM de

Respostas:

130

Isso é o que acabei usando uma variação de, que verifica o IE8 e abaixo:

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
fonte
75
Este padrão reconhecerá o Internet Explorer 10 como Internet Explorer 1.
caos
2
Eu acho que algumas versões do Opera combinam com isso, mas elas podem ser filtradas verificando por 'Opera'.
Liam
45
apenas mude para '/(?i)msie [2-8]/'. Você realmente precisa verificar se há 1 ? Foi lançado em 1995 e foi substituído pelo ie2 alguns meses depois.
Landon
8
Eu mudei para [4-8]. As atualizações do IE estão ficando cada vez mais frequentes e eu realmente quero ter certeza de não ter que fazer uma mudança semelhante durante a vida útil do aplicativo da web em que estou trabalhando (já que ele dura apenas 3 anos). Se alguém estiver navegando na web com o IE 5 ou menos, terá muito mais problemas do que visualizar meu aplicativo da web.
Adam Erstelle
2
Se você apenas adicionar um ponto, ele verificará as versões de número inferior sem verificar a versão 10, 20, etc.'/(?i)msie [1-8]\./'
michaellindahl
85

Uma versão que continuará a funcionar com IE10 e 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
fonte
2
Não sei por que você usou uma instrução switch quando parece que if / then seria mais apropriado, mas funcionou muito bem. E, aparentemente, você foi o único que leu que o OP queria suporte de versão separada.
Jake
na verdade, tivemos que direcionar o IE incluindo 11 e funcionou perfeitamente
code_monk
Dispositivos mais novos podem ter atributos diferentes no agente de usuário do IE11, conforme mencionado aqui: github.com/woothee/woothee-java/issues/6. Para corrigir isso, a expressão regular deve ser alterada para:, Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)e $version = $matches[1];deve ser alterada para $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Você pode ver um exemplo de regex aqui: regexr.com/3fb4k.
jdgregson
16

Você pode verificar a variável de servidor HTTP_USER_AGENT. O agente do usuário transferido pelo IE contém MSIE

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

Para versões específicas, você pode estender sua condição

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

Veja também esta questão relacionada .

Daff
fonte
@dixus para IE11 você tem que fazer issopreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK
16

Aqui está um ótimo recurso para detectar navegadores em php: http://php.net/manual/en/function.get-browser.php

Aqui está um dos exemplos que parece o mais simples:

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

Então, mais tarde em seu código, você poderia dizer algo como

$browser = get_user_browser();
if($browser == "ie"){
    //do stuff
}
Michael Jasper
fonte
1
Existe algum motivo para definir $ ub e devolvê-lo no final. Certamente é mais eficiente (pula alguns se desnecessários) retornar o nome do navegador em vez de definir a variável.
w4etwetewtwet
1
Alguns testes simples de navegador, mas não faz versões como o pedido ...
Jake
useragent do chrome contém safari. portanto, o teste acima deve relatar o cromo como safari. a ordem deve ser invertida. verifique a palavra-chave chrome primeiro.
Média de Joe em
10

Eu faço isso

$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
fonte
Gosto desta versão e modifiquei-a para incluir no IE11 no Windows 8.1.
Mike Kormendy
5

O PHP tem uma função chamada get_browser () que retorna um objeto (ou array se você escolher) com detalhes sobre o navegador dos usuários e o que ele pode fazer.

Uma simples olhada me deu este código:

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

Esta não é uma maneira infalível (conforme se lê em HTTP_USER_AGENT , que pode ser falsificado e, às vezes, será analisado incorretamente por php), mas é a mais fácil que você pode encontrar até onde eu sei.

Mike S
fonte
2
requer configurações do lado do servidor para funcionar. Não tenho certeza de quão confiável é para os produtos rodarem em servidores diferentes
letão
5
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
// eh, IE found
}
xsor
fonte
Isso não corresponde às versões (e corresponderá ao IE 10 etc.)
Oytun
4

Você também pode consultar o http://php.net/manual/en/function.get-browser.php do PHPget_browser();

Talvez você ache útil para mais recursos.

tomsseisums
fonte
3
Arrumado. Mas requer uma configuração em seu php.ini, o que pode ser um problema para alguns usuários.
Jake
4

Aqui está uma pequena função php que escrevi que usa o regex diretamente do código de detecção de javascript sugerido pela MSFT neste artigo: 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
fonte
3

Verificar apenas o MSIE não é suficiente para detectar o IE. Você também precisa do "Trident", que só é usado no IE11. Então aqui está minha solução que funcionou nas versões 8 a 11.

$agent=strtoupper($_SERVER['HTTP_USER_AGENT']);
$isIE=(strpos($agent,'MSIE')!==false || strpos($agent,'TRIDENT')!==false);
Markus Zeller
fonte
Por favor, veja o título da pergunta.
Jamie Barker,
2

Você pode fazer isso analisando o cabeçalho do agente do usuário:

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

Esteja ciente de que isso não é muito confiável e pode ser falsamente falsificado.

Uku Loskit
fonte
Lembre-se de que o User Agentpode ser falsificado.
drudge
7
Se o usuário quiser falsificar o seu User-Agent, ele deseja recuperar o conteúdo da página como se esse fosse realmente seu agente de usuário. O resultado é o que eles pediram. Não há problema aqui.
Lightness Races in Orbit
2

'HTTP_USER_AGENT' Conteúdo do User-Agent: cabeçalho da solicitação atual, se houver. Esta é uma string que denota o agente do usuário que está acessando a página. Um exemplo típico é: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Entre outras coisas, você pode usar este valor com get_browser () para adaptar a saída de sua página aos recursos do agente do usuário.

Portanto, suponho que você será capaz de obter o nome / id do navegador da variável $ _SERVER ["HTTP_USER_AGENT"].

Arnehehe
fonte
1

Você pode usar algo assim para diferentes mensagens 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 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
fonte
1

mas ainda útil - e funciona com o IE11! aqui está outra maneira resumida de obter os navegadores comuns retornados para a 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;
}

Portanto, esta função retorna: 'safari' ou 'firefox' ou 'cromo', ou 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.

espero que ajude

antoni
fonte
0

Observe o caso em '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
fonte
0

se você tiver o Internet Explorer 11 e ele estiver sendo executado em um PC com tela de toque, você deve usar: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) em vez de: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])

Ivan Mendizabal Saravia
fonte
-1

Uma abordagem baseada em tridend seria melhor. Aqui está uma função rápida para verificar o IE 8.

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