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.