PHP: jeśli Internet Explorer 6, 7, 8 lub 9


86

Chcę zrobić warunek w PHP dla różnych wersji Internet Explorera w następujący sposób:

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

Widziałem wiele odmian podobnego kodu, ale szukam czegoś super prostego, co jest bardzo łatwe do zrobienia w prosty sposób, aby zrobić kilka prostych rzeczy i zrobić różne rzeczy.

Dzięki

EDYCJA: Potrzebuję tego, aby wyświetlać użytkownikom różne komunikaty, więc warunkowe CSS itp. Nie są dobre.


4
Czy chcesz obsługiwać różne CSS? W takim przypadku rozważ komentarze warunkowe . Mniej kłopotów
Pekka

1
Najwyraźniej IE10 nie obsługuje instrukcji warunkowych.
CharlieM

Odpowiedzi:


130

Oto, co skończyło się na użyciu odmiany, która sprawdza IE8 i poniżej:

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
Ten wzorzec rozpozna Internet Explorer 10 jako Internet Explorer 1.
chaos

2
Myślę, że niektóre wersje Opery będą pasować do tego, ale można je odfiltrować, sprawdzając „Opera”.
Liam

45
po prostu zmień to na '/(?i)msie [2-8]/'. Czy naprawdę musisz sprawdzić np. 1 ? Został wydany w 1995 roku i kilka miesięcy później został zastąpiony przez ie2.
Landon

8
Zmieniłem to na [4-8]. Aktualizacje IE stają się coraz częstsze i naprawdę chcę się upewnić, że nie muszę wprowadzać podobnej zmiany w czasie życia aplikacji internetowej, nad którą pracuję (ponieważ ma ona tylko 3 lata życia). Jeśli ktoś przegląda Internet za pomocą IE 5 lub starszego, ma ZNACZNIE więcej problemów niż przeglądanie mojej aplikacji internetowej.
Adam Erstelle,

2
Jeśli po prostu dodać okres będzie sprawdzać dla niższych wersjach numer bez sprawdzania wersji 10, 20, itd'/(?i)msie [1-8]\./'
michaellindahl

85

Wersja, która będzie nadal działać zarówno z IE10, jak i 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
Nie jestem pewien, dlaczego użyłeś instrukcji switch, skoro wydaje się, że bardziej odpowiednie byłoby jeśli / to, ale to zadziałało świetnie. I najwyraźniej byłeś jedynym, który przeczytał, że OP chciał obsługiwać oddzielną wersję.
Jake

faktycznie musieliśmy kierować reklamy na IE, w tym 11 i to działało pięknie
code_monk

Nowsze urządzenia mogą mieć różne atrybuty w kliencie użytkownika IE11, jak wspomniano tutaj: github.com/woothee/woothee-java/issues/6. Aby to naprawić, wyrażenie regularne należy zmienić na:, Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)i $version = $matches[1];należy zmienić na $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Możesz zobaczyć przykład wyrażenia regularnego tutaj: regexr.com/3fb4k.
jdgregson

16

Możesz sprawdzić zmienną serwera HTTP_USER_AGENT. Agent użytkownika przesłany przez IE zawiera MSIE

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

W przypadku określonych wersji możesz przedłużyć swój stan

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

Zobacz także to powiązane pytanie .


@dixus dla IE11 musisz to zrobićpreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

Oto świetne źródło informacji na temat wykrywania przeglądarek w php: http://php.net/manual/en/function.get-browser.php

Oto jeden z przykładów, który wydaje się najprostszy:

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

Później w swoim kodzie możesz powiedzieć coś w rodzaju

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

1
Czy jest jakiś powód, aby ustawić $ ub, a następnie zwrócić go na koniec. Z pewnością bardziej wydajne (pomija niektóre niepotrzebne jeśli) jest zwrócenie nazwy przeglądarki zamiast ustawiania zmiennej.
w4etwetewtwet

1
Proste, standardowe testy przeglądarki, ale nie obsługuje wersji takich jak żądanie ...
Jake

agent użytkownika chrome zawiera safari. więc powyższy test powinien zgłaszać chrome jako safari. kolejność powinna zostać odwrócona. najpierw sprawdź słowo kluczowe chrome.
Przeciętny Joe

10

robię to

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

Podoba mi się ta wersja i zmodyfikowałem ją, aby uwzględnić IE11 w systemie Windows 8.1.
Mike Kormendy

5

PHP ma funkcję o nazwie get_browser () , która zwróci obiekt (lub tablicę, jeśli tak wybierzesz) ze szczegółami o przeglądarce użytkownika i jej możliwościach.

Proste spojrzenie dało mi ten kod:

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

Nie jest to pewny sposób (ponieważ czyta z HTTP_USER_AGENT , który może być sfałszowany i czasami będzie nieprawidłowo analizowany przez php), ale jest to najłatwiejszy sposób, jaki możesz znaleźć, o ile wiem.


2
wymaga do działania konfiguracji po stronie serwera. Nie jestem pewien, na ile niezawodne jest działanie produktów na różnych serwerach
łotewski

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

To nie pasuje do wersji (i będzie pasować do IE 10 itp.)
Oytun


4

Oto mała funkcja php, którą napisałem, która używa wyrażenia regularnego bezpośrednio z sugerowanego przez MSFT kodu wykrywania javascript z tego artykułu: 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

Sprawdzanie samego MSIE nie wystarczy do wykrycia IE. Potrzebujesz także "Trident", który jest używany tylko w IE11. Oto moje rozwiązanie, które działało w wersjach od 8 do 11.

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

Zobacz tytuł pytania.
Jamie Barker

2

Możesz to zrobić, analizując nagłówek klienta użytkownika:

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

Uważaj, ponieważ nie jest to zbyt wiarygodne i można je w trywialny sposób podrobić.


Pamiętaj tylko, że User Agentmożna go sfałszować.
drudge

7
Jeśli użytkownik chce je sfałszować User-Agent, chce odzyskać zawartość strony, tak jakby to naprawdę był jego klient użytkownika. Wynik jest taki, o jaki prosili. Nie ma problemu.
Wyścigi lekkości na orbicie

2

„HTTP_USER_AGENT” Zawartość nagłówka User-Agent: z bieżącego żądania, jeśli istnieje. To jest ciąg znaków wskazujący agenta użytkownika, który uzyskuje dostęp do strony. Typowym przykładem jest: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Możesz między innymi użyć tej wartości z get_browser (), aby dostosować wyjście strony do możliwości klienta użytkownika.

Zakładam więc, że będziesz w stanie uzyskać nazwę / identyfikator przeglądarki ze zmiennej $ _SERVER ["HTTP_USER_AGENT"].


1

Możesz użyć czegoś takiego do różnych wiadomości lub 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]-->

LUB użyj innego elementu div z 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

ale nadal przydatne - i działa z IE11! oto kolejny krótki sposób na zwrócenie typowych przeglądarek dla klasy 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;
}

Więc ta funkcja zwraca: „safari” lub „firefox” lub „chrome”, lub „ie ie8”, „ie ie9”, „ie ie10”, „ie ie11”.

mam nadzieję, że to pomoże


0

Zwróć uwagę na przypadek w '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

jeśli masz Internet Explorer 11 i działa on na komputerze z ekranem dotykowym, musisz użyć: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) zamiast: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])


-1

Lepsze byłoby podejście oparte na trójdendach. Oto szybka funkcja sprawdzania IE 8.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.