PHP: Jika internet explorer 6, 7, 8, atau 9

86

Saya ingin melakukan kondisional dalam PHP untuk berbagai versi Internet Explorer di sepanjang baris:

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

Saya telah melihat banyak variasi pada kode yang serupa, tetapi mencari sesuatu yang super sederhana yang sangat mudah untuk dikodekan untuk melakukan beberapa hal yang sederhana dan melakukan hal yang berbeda.

Terima kasih

EDIT: Saya membutuhkan ini untuk menampilkan beberapa pesan berbeda kepada pengguna sehingga persyaratan CSS dll tidak baik.

Cameron
sumber
4
Apakah Anda ingin menyajikan CSS yang berbeda? Dalam hal ini, pertimbangkan komentar bersyarat . Tidak repot
Pekka
1
Rupanya IE10 tidak mendukung pernyataan bersyarat.
CharlieM

Jawaban:

130

Inilah yang akhirnya saya gunakan variasi, yang memeriksa IE8 dan di bawahnya:

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
sumber
75
Pola ini akan mengenali Internet Explorer 10 sebagai Internet Explorer 1.
kekacauan
2
Saya pikir beberapa versi Opera akan cocok dengan ini, tetapi mereka dapat disaring dengan memeriksa 'Opera'.
Liam
45
ubah saja menjadi '/(?i)msie [2-8]/'. Apakah Anda benar-benar perlu memeriksa ie 1 ? Ini dirilis pada tahun 1995 dan digantikan oleh IE2 beberapa bulan kemudian.
Landon
8
Saya mengubahnya menjadi [4-8]. Pembaruan IE semakin sering dan saya benar-benar ingin memastikan bahwa saya tidak perlu melakukan perubahan serupa selama masa pakai aplikasi web yang saya kerjakan (karena hanya memiliki masa hidup 3 tahun). Jika seseorang menjelajah web dengan IE 5 atau kurang, mereka JAUH lebih bermasalah daripada melihat aplikasi web saya.
Adam Erstelle
2
Jika Anda hanya menambahkan titik, itu akan memeriksa versi nomor yang lebih rendah tanpa memeriksa versi 10, 20, dll.'/(?i)msie [1-8]\./'
michaellindahl
85

Versi yang akan terus berfungsi dengan IE10 dan 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
sumber
2
Saya tidak yakin mengapa Anda menggunakan pernyataan sakelar padahal sepertinya jika / maka akan lebih tepat, tetapi ini bekerja dengan baik. Dan ternyata Anda satu-satunya yang membaca bahwa OP menginginkan dukungan versi terpisah.
Jake
kami sebenarnya harus menargetkan IE termasuk 11 dan ini bekerja dengan baik
code_monk
Perangkat yang lebih baru dapat memiliki atribut berbeda di agen pengguna IE11, seperti yang disebutkan di sini: github.com/woothee/woothee-java/issues/6. Untuk memperbaikinya, ekspresi reguler harus diubah menjadi ini:, Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)dan $version = $matches[1];harus diubah menjadi $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Anda dapat melihat contoh regex di sini: regexr.com/3fb4k.
jdgregson
16

Anda dapat memeriksa variabel server HTTP_USER_AGENT. Agen pengguna yang ditransfer oleh IE berisi MSIE

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

Untuk versi tertentu, Anda dapat memperpanjang kondisi Anda

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

Lihat juga pertanyaan terkait ini .

Daff
sumber
@dixus untuk IE11 Anda harus melakukan inipreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK
16

Berikut adalah sumber yang bagus untuk mendeteksi browser di php: http://php.net/manual/en/function.get-browser.php

Berikut ini salah satu contoh yang tampaknya paling sederhana:

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

Kemudian di kode Anda, Anda bisa mengatakan sesuatu seperti

$browser = get_user_browser();
if($browser == "ie"){
    //do stuff
}
Michael Jasper
sumber
1
Apakah ada alasan untuk menyetel $ ub, dan kemudian mengembalikannya di akhir. Tentunya lebih efisien (melompati beberapa if yang tidak perlu) untuk mengembalikan nama browser daripada menyetel variabel.
w4etwetewtwet
1
Beberapa pengujian browser stok sederhana, tetapi tidak melakukan versi seperti permintaan ...
Jake
agen pengguna chrome berisi safari. jadi tes di atas harus melaporkan chrome sebagai safari. pesanan harus dibalik. periksa kata kunci chrome terlebih dahulu.
Rata
10

saya melakukan ini

$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
sumber
Saya suka versi ini, dan telah memodifikasinya untuk menyertakan IE11 pada Windows 8.1.
Mike Kormendy
5

PHP memiliki fungsi bernama get_browser () yang akan mengembalikan objek (atau larik jika Anda memilihnya) dengan detail tentang browser pengguna dan apa yang dapat dilakukannya.

Tampilan sederhana memberi saya kode ini:

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

Ini bukan cara yang pasti (karena terbaca dari HTTP_USER_AGENT , yang dapat dipalsukan, dan terkadang akan salah dianalisis oleh php), tetapi ini adalah cara termudah yang dapat Anda temukan sejauh yang saya tahu.

Mike S.
sumber
2
membutuhkan konfigurasi sisi server untuk bekerja. Saya tidak yakin seberapa dapat diandalkannya produk untuk dijalankan di server yang berbeda
latvian
5
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
// eh, IE found
}
xsor
sumber
Ini tidak cocok dengan versi (dan akan cocok dengan IE 10 dll)
Oytun
4

Anda juga dapat melihat http://php.net/manual/en/function.get-browser.php PHPget_browser();

Mungkin Anda akan merasa berguna untuk lebih banyak fitur.

tomsseisums.dll
sumber
3
Rapi. Tetapi ini membutuhkan pengaturan di php.ini Anda yang bisa menjadi masalah bagi beberapa pengguna.
Jake
4

Berikut adalah sedikit fungsi php yang saya tulis yang menggunakan regex langsung dari kode sniffing javascript yang disarankan MSFT dari artikel ini: 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.dll
sumber
3

Memeriksa MSIE saja tidak cukup untuk mendeteksi IE. Anda juga membutuhkan "Trident" yang hanya digunakan di IE11. Jadi inilah solusi saya yang berfungsi untuk versi 8 hingga 11.

$agent=strtoupper($_SERVER['HTTP_USER_AGENT']);
$isIE=(strpos($agent,'MSIE')!==false || strpos($agent,'TRIDENT')!==false);
Markus Zeller
sumber
Silakan lihat judul pertanyaan.
Jamie Barker
2

Anda dapat melakukannya dengan mengurai header agen-pengguna:

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

Berhati-hatilah karena ini tidak terlalu andal dan dapat dipalsukan secara sepele.

Uku Loskit
sumber
Ingatlah bahwa User Agentbisa dipalsukan.
membanting tulang
7
Jika pengguna ingin memalsukannya User-Agent, mereka ingin mengambil konten laman seolah-olah itu benar-benar agen penggunanya. Hasilnya adalah apa yang mereka minta. Tidak masalah disini.
Balapan Ringan di Orbit
2

'HTTP_USER_AGENT' Isi User-Agent: header dari permintaan saat ini, jika ada. Ini adalah string yang menunjukkan agen pengguna yang mengakses halaman. Contoh tipikal adalah: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Antara lain, Anda dapat menggunakan nilai ini dengan get_browser () untuk menyesuaikan keluaran halaman Anda dengan kemampuan agen pengguna.

Jadi saya berasumsi Anda akan bisa mendapatkan nama / id browser dari variabel $ _SERVER ["HTTP_USER_AGENT"].

arnehehe
sumber
1

Anda dapat menggunakan sesuatu seperti ini untuk pesan atau div / css yang berbeda

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

ATAU gunakan div css yang berbeda

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

tetapi masih berguna - dan berfungsi dengan IE11! berikut adalah cara singkat lain untuk mendapatkan kembali browser umum untuk kelas 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;
}

Jadi fungsi ini mengembalikan: 'safari' atau 'firefox' atau 'chrome', atau 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.

semoga membantu

antoni
sumber
0

Perhatikan kasus di '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
sumber
0

jika Anda memiliki Internet Explorer 11 dan berjalan melalui pc layar sentuh, Anda harus menggunakan: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) alih-alih: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])

Ivan Mendizabal Saravia
sumber
-1

Pendekatan berbasis trisula akan lebih baik. Berikut adalah fungsi cepat untuk memeriksa IE 8.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
sajin tm
sumber