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.