PHP: İnternet explorer 6, 7, 8 veya 9 ise


86

PHP'de Internet Explorer'ın farklı sürümleri için şu satırlar boyunca bir koşul yapmak istiyorum:

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

Benzer kodun birçok varyasyonunu gördüm, ancak bazı basit if ve else yapmak ve farklı şeyler yapmak için kodlaması çok kolay olan süper basit bir şey arıyorum.

Teşekkürler

DÜZENLEME: Kullanıcılara bazı farklı mesajlar göstermek için buna ihtiyacım var, bu yüzden CSS koşullu vb. İyi değil.


4
Farklı CSS'ler mi sunmak istiyorsunuz? Bu durumda, koşullu yorumları dikkate alın . Daha az uğraş
Pekka

1
Görünüşe göre IE10 koşullu ifadeleri desteklemiyor.
CharlieM

Yanıtlar:


130

Bu, IE8 ve altını kontrol eden bir varyasyonunu kullandığım şeydi:

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
Bu kalıp, Internet Explorer 10'u Internet Explorer 1 olarak tanıyacaktır.
kaos

2
Sanırım Opera'nın bazı sürümleri bununla eşleşecek, ancak 'Opera' kontrol edilerek filtrelenebilirler.
Liam

45
sadece olarak değiştirin '/(?i)msie [2-8]/'. IE 1'i gerçekten kontrol etmeniz gerekiyor mu? 1995'te piyasaya sürüldü ve birkaç ay sonra ie2 ile değiştirildi.
Landon

8
[4-8] olarak değiştirdim. IE güncellemeleri gittikçe daha sık hale geliyor ve üzerinde çalıştığım web uygulamasının ömrü boyunca benzer bir değişiklik yapmak zorunda olmadığımdan emin olmak istiyorum (yalnızca 3 yıllık bir ömrü olduğu için). Birisi internette IE 5 veya daha azıyla geziniyorsa, web uygulamamı görüntülemekten ÇOK daha fazla sorun yaşar.
Adam Erstelle

2
Sadece bir nokta eklerseniz, sürüm 10, 20, vb. İçin kontrol etmeden daha düşük numaralı sürümleri kontrol edecektir.'/(?i)msie [1-8]\./'
michaellindahl

85

Hem IE10 hem de IE11 ile çalışmaya devam edecek bir sürüm:

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
Eğer / o zaman daha uygun göründüğünde neden bir anahtar deyimi kullandığınızı bilmiyorum, ama bu harika çalıştı. Ve görünüşe göre OP'nin ayrı sürüm desteği istediğini okuyan tek kişi sizsiniz.
Jake,

aslında 11 dahil IE'yi hedeflememiz gerekiyordu ve bu çok güzel çalıştı
code_monk

Daha yeni cihazlar, burada belirtildiği gibi IE11 kullanıcı aracısında farklı özelliklere sahip olabilir: github.com/woothee/woothee-java/issues/6. Bunu düzeltmek için, normal ifade şu şekilde değiştirilmeli: Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)ve $version = $matches[1];olarak değiştirilmelidir $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Burada normal ifadenin bir örneğini görebilirsiniz: regexr.com/3fb4k.
jdgregson

16

HTTP_USER_AGENT sunucu değişkenini kontrol edebilirsiniz. IE tarafından aktarılan kullanıcı aracısı MSIE içerir

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

Belirli versiyonlar için durumunuzu uzatabilirsiniz

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

Ayrıca bu ilgili soruya bakın .


@dixus IE11 için bunu yapmalısınpreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

İşte php'deki tarayıcıları tespit etmek için harika bir kaynak: http://php.net/manual/en/function.get-browser.php

İşte en basit görünen örneklerden biri:

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

Daha sonra kodunuzda şöyle bir şey söyleyebilirsiniz:

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

1
$ Ub ayarlayıp sonunda onu döndürmek için herhangi bir sebep var mı? Değişkeni ayarlamak yerine tarayıcının adını döndürmek elbette daha etkilidir (bazı gereksiz if'leri atlar).
w4etwetewtwet

1
Bazı basit, stok tarayıcı testleri, ancak istek gibi sürümler yapmıyor ...
Jake

chrome useragent safari içerir. bu yüzden yukarıdaki test kromu safari olarak rapor etmelidir. sipariş tersine çevrilmelidir. önce chrome anahtar kelimesini kontrol edin.
Ortalama Joe

10

Bunu yaparım

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

Bu sürümü beğendim ve Windows 8.1'de IE11'i içerecek şekilde değiştirdim.
Mike Kormendy

5

PHP, kullanıcıların tarayıcısı ve neler yapabileceği hakkında ayrıntılar içeren bir nesne (veya isterseniz bir dizi ) döndürecek get_browser () adında bir işleve sahiptir .

Basit bir bakış bana şu kodu verdi:

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

Bu kesin bir yol değil ( HTTP_USER_AGENT'ten okunduğu gibi , sahte olabilir ve bazen php tarafından yanlış analiz edilecektir), ama bildiğim kadarıyla bulabileceğiniz en kolay yol bu.


2
sunucu tarafı yapılandırmalarının çalışmasını gerektirir. Ürünlerin farklı sunucularda çalıştırılmasının ne kadar güvenilir olduğundan emin değilim
Letonya

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

Bu sürümlerle eşleşmiyor (ve IE 10 vb.
İle


4

Burada yazdığım küçük bir php işlevi, bu makaleden doğrudan MSFT'nin önerdiği javascript koklama kodundan regex'i kullanıyor: 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

Yalnızca MSIE'nin kontrol edilmesi, IE'yi tespit etmek için yeterli değildir. Ayrıca sadece IE11'de kullanılan "Trident" e ihtiyacınız var. İşte 8'den 11'e kadar olan sürümlerde çalışan benim çözümüm.

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

Lütfen soru başlığına bakın.
Jamie Barker

2

Bunu, kullanıcı aracısı başlığını ayrıştırarak yapabilirsiniz:

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

Bunun çok güvenilir olmadığına ve önemsiz şekilde sahte olabileceğine dikkat edin.


Sadece User Agentsahte olabileceğini unutmayın .
drudge

7
Kullanıcı kendi kullanıcı aracısıymış User-Agentgibi sayfanın içeriğini almak isterse , sayfanın içeriğini almak ister. Sonuç, istedikleri şeydi. Burada sorun yok.
Yörüngede Hafiflik Yarışları

2

'HTTP_USER_AGENT' User-Agent'ın içeriği: varsa, mevcut istekten başlık. Bu, sayfaya erişmekte olan kullanıcı aracısını gösteren bir dizedir. Tipik bir örnek: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Diğer şeylerin yanı sıra, sayfanızın çıktısını kullanıcı aracısının yeteneklerine göre uyarlamak için bu değeri get_browser () ile birlikte kullanabilirsiniz.

Dolayısıyla, tarayıcı adını / kimliğini $ _SERVER ["HTTP_USER_AGENT"] değişkeninden alabileceğinizi varsayıyorum.


1

Farklı mesajlar veya div / css için buna benzer bir şey kullanabilirsiniz.

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

VEYA farklı css div kullanın

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

ama yine de kullanışlı - ve IE11 ile çalışıyor! css sınıfı için döndürülen yaygın tarayıcıları almanın başka bir kısa yolu:

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

Dolayısıyla bu işlev şunu döndürür: 'safari' veya 'firefox' veya 'chrome' veya 'ie ie8', 'ie9', 'ie ie10', 'ie 11'.

Umarım yardımcı olur


0

"Trident" deki duruma dikkat edin:

if (isset($_SERVER['HTTP_USER_AGENT']) &&
    ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false)) {   
     // IE is here :-(
    }

0

Internet Explorer 11'iniz varsa ve dokunmatik ekranlı bir bilgisayar üzerinde çalışıyorsa, preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])


-1

Trend tabanlı bir yaklaşım daha iyi olurdu. İşte IE 8'i kontrol etmek için hızlı bir işlev.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.