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.

Cameron
źródło
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
}
Cameron
źródło
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
  }
}
Doug
źródło
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 .

Daff
źródło
@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
}
Michael Jasper
źródło
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
}
Vince Lowe
źródło
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.

Mike S.
źródło
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
}
xsor
źródło
To nie pasuje do wersji (i będzie pasować do IE 10 itp.)
Oytun
4

Możesz również zajrzeć do http://php.net/manual/en/function.get-browser.php PHPget_browser();

Może uznasz to za przydatne w przypadku większej liczby funkcji.

tomsseisums
źródło
3
Schludny. Ale wymaga ustawienia w twoim php.ini, co może być problemem dla niektórych użytkowników.
Jake
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;

}
minorgod
źródło
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);
Markus Zeller
źródło
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ć.

Uku Loskit
źródło
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"].

arnehehe
źródło
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]-->
Enrico Tempesti
źródło
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

antoni
źródło
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 :-(
    }
Vlado
źródło
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 '])

Ivan Mendizabal Saravia
źródło
-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; 
} 
?>
sajin tm
źródło