PHP: Wenn Internet Explorer 6, 7, 8 oder 9


86

Ich möchte eine Bedingung in PHP für die verschiedenen Versionen von Internet Explorer ausführen, wie folgt:

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

Ich habe viele Variationen von ähnlichem Code gesehen, aber ich suche nach etwas Supereinfachem, das sehr einfach zu codieren ist, um ein einfaches Wenn und Sonstiges zu tun und verschiedene Dinge zu tun.

Vielen Dank

BEARBEITEN: Ich brauche dies, um Benutzern verschiedene Nachrichten anzuzeigen, damit CSS-Bedingungen usw. nicht gut sind.


4
Möchten Sie unterschiedliche CSS-Dienste anbieten? Berücksichtigen Sie in diesem Fall bedingte Kommentare . Weniger Ärger
Pekka

1
Anscheinend unterstützt IE10 keine bedingten Anweisungen.
CharlieM

Antworten:


130

Dies ist, was ich am Ende mit einer Variation von verwendet habe, die nach IE8 und darunter sucht:

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
Dieses Muster erkennt Internet Explorer 10 als Internet Explorer 1.
Chaos

2
Ich denke, einige Versionen von Opera werden dem entsprechen, aber sie können herausgefiltert werden, indem Sie nach 'Opera' suchen.
Liam

45
ändere es einfach auf '/(?i)msie [2-8]/'. Müssen Sie wirklich nach zB 1 suchen? Es wurde 1995 veröffentlicht und einige Monate später durch ie2 ersetzt.
Landon

8
Ich habe es in [4-8] geändert. IE-Updates werden immer häufiger und ich möchte wirklich sicherstellen, dass ich während der Lebensdauer der Web-App, an der ich arbeite, keine ähnlichen Änderungen vornehmen muss (da sie nur eine Lebensdauer von 3 Jahren hat). Wenn jemand mit IE 5 oder weniger im Internet surft, hat er weitaus mehr Probleme als das Anzeigen meiner Web-App.
Adam Erstelle

2
Wenn Sie nur einen Punkt hinzufügen, wird nach Versionen mit niedrigerer Anzahl '/(?i)msie [1-8]\./'
gesucht,

85

Eine Version, die weiterhin mit IE10 und IE11 funktioniert:

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
Ich bin mir nicht sicher, warum Sie eine switch-Anweisung verwendet haben, wenn es so aussieht, als wäre ein Wenn / Dann angemessener, aber das hat großartig funktioniert. Und anscheinend waren Sie der einzige, der gelesen hat, dass das OP eine separate Versionsunterstützung wünschte.
Jake

Wir mussten tatsächlich auf IE einschließlich 11
abzielen

Neuere Geräte können im IE11-Benutzeragenten unterschiedliche Attribute haben, wie hier erwähnt: github.com/woothee/woothee-java/issues/6. Um dies zu beheben, sollte der reguläre Ausdruck in: geändert Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)und $version = $matches[1];in geändert werden $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Ein Beispiel für den regulären Ausdruck finden Sie hier: regexr.com/3fb4k.
Jdgregson

16

Sie können die Servervariable HTTP_USER_AGENT überprüfen. Der vom IE übertragene Benutzeragent enthält MSIE

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

Für bestimmte Versionen können Sie Ihren Zustand erweitern

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

Siehe auch diese verwandte Frage .


@dixus für IE11 müssen Sie dies tunpreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

Hier ist eine großartige Ressource zum Erkennen von Browsern in PHP: http://php.net/manual/en/function.get-browser.php

Hier ist eines der Beispiele, das am einfachsten erscheint:

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

Dann könnten Sie später in Ihrem Code so etwas sagen

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

1
Gibt es einen Grund, $ ub zu setzen und am Ende zurückzugeben? Sicherlich ist es effizienter (überspringt einige unnötige Wenns), den Namen des Browsers zurückzugeben, anstatt die Variable festzulegen.
w4etwetewtwet

1
Einige einfache Browsertests, aber es werden keine Versionen wie die Anfrage ausgeführt ...
Jake

Chrome Useragent enthält Safari. Daher sollte der obige Test Chrom als Safari melden. Die Reihenfolge sollte umgekehrt werden. Überprüfen Sie zuerst das Schlüsselwort Chrome.
Durchschnittlicher Joe

10

Ich mache das

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

Ich mag diese Version und habe sie so geändert, dass sie für IE11 unter Windows 8.1 enthalten ist.
Mike Kormendy

5

PHP hat eine Funktion namens get_browser () , die ein Objekt (oder Array, wenn Sie dies wünschen) mit Details über den Browser der Benutzer und dessen Funktionen zurückgibt .

Ein einfacher Blick gab mir diesen Code:

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

Dies ist kein todsicherer Weg (wie aus HTTP_USER_AGENT hervorgeht , der gefälscht werden kann und manchmal von PHP falsch analysiert wird), aber es ist der einfachste, den Sie finden können, soweit ich weiß.


2
erfordert serverseitige Konfigurationen, um zu funktionieren. Ich bin nicht sicher, wie zuverlässig es ist, dass Produkte auf verschiedenen Servern ausgeführt werden
lettisch am

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

Dies stimmt nicht mit Versionen überein (und wird mit IE 10 usw.
übereinstimmen


4

Hier ist eine kleine PHP-Funktion, die ich geschrieben habe und die den regulären Ausdruck direkt aus dem von MSFT vorgeschlagenen Javascript-Sniffing-Code aus diesem Artikel verwendet: 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

Nur nach MSIE zu suchen, reicht nicht aus, um den IE zu erkennen. Sie benötigen auch "Trident", das nur in IE11 verwendet wird. Also hier ist meine Lösung, die eine Version 8 bis 11 funktionierte.

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

Bitte siehe Fragentitel.
Jamie Barker

2

Sie können dies tun, indem Sie den User-Agent-Header analysieren:

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

Seien Sie vorsichtig, dass dies nicht sehr zuverlässig ist und trivial gefälscht werden kann.


Denken Sie daran, dass die User Agentgefälscht werden kann.
Plackerei

7
Wenn der Benutzer seine User-AgentInhalte fälschen möchte , möchte er den Inhalt der Seite abrufen, als ob dies wirklich sein Benutzeragent wäre. Das Ergebnis ist das, wonach sie gefragt haben. Kein Problem hier.
Leichtigkeitsrennen im Orbit

2

'HTTP_USER_AGENT' Inhalt des User-Agent: Header aus der aktuellen Anfrage, falls vorhanden. Dies ist eine Zeichenfolge, die den Benutzeragenten angibt, der auf die Seite zugreift. Ein typisches Beispiel ist: Mozilla / 4.5 [de] (X11; U; Linux 2.2.9 i586). Unter anderem können Sie diesen Wert mit get_browser () verwenden, um die Ausgabe Ihrer Seite an die Funktionen des Benutzeragenten anzupassen.

Ich gehe also davon aus, dass Sie den Browsernamen / die ID aus der Variablen $ _SERVER ["HTTP_USER_AGENT"] abrufen können.


1

Sie könnten so etwas für verschiedene Nachrichten oder div / css verwenden

<!--[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]-->

ODER verwenden Sie ein anderes div von 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

aber immer noch nützlich - und funktioniert mit IE11! Hier ist ein weiterer kurzer Weg, um die gängigen Browser für die CSS-Klasse zurückzugeben:

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

Diese Funktion gibt also Folgendes zurück: "Safari" oder "Firefox" oder "Chrom" oder "dh 8", "dh 9", "dh 10", "dh 11".

ich hoffe es hilft


0

Beachten Sie den Fall in '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

Wenn Sie über Internet Explorer 11 verfügen und dieser über einen Touchscreen-PC ausgeführt wird, müssen Sie Folgendes verwenden: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) anstelle von: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])


-1

Ein tridendbasierter Ansatz wäre besser. Hier ist eine schnelle Funktion zum Überprüfen von IE 8.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.