PHP: Nếu Internet explorer 6, 7, 8 hoặc 9


86

Tôi muốn thực hiện một điều kiện trong PHP cho các phiên bản Internet Explorer khác nhau dọc theo dòng:

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

Tôi đã thấy nhiều biến thể về mã tương tự, nhưng đang tìm kiếm thứ gì đó siêu đơn giản, rất dễ viết mã để thực hiện một số việc đơn giản nếu có và làm những việc khác.

Cảm ơn

CHỈNH SỬA: Tôi cần cái này để hiển thị một số thông báo khác nhau cho người dùng vì vậy điều kiện CSS, v.v. không tốt.


4
Bạn đang muốn phân phát các CSS khác nhau? Trong trường hợp đó, hãy xem xét các ý kiến ​​có điều kiện . Ít rắc rối hơn
Pekka

1
Rõ ràng IE10 không hỗ trợ các câu lệnh có điều kiện.
CharlieM

Câu trả lời:


130

Đây là những gì tôi đã kết thúc bằng cách sử dụng một biến thể, kiểm tra IE8 trở xuống:

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
Mẫu này sẽ nhận ra Internet Explorer 10 là Internet Explorer 1.
hỗn loạn vào

2
Tôi nghĩ rằng một số phiên bản của Opera sẽ phù hợp với điều này, nhưng chúng có thể được lọc ra bằng cách kiểm tra 'Opera'.
Liam

45
chỉ cần thay đổi nó thành '/(?i)msie [2-8]/'. Bạn có thực sự cần phải kiểm tra nghĩa là 1 ? Nó được phát hành vào năm 1995 và được thay thế bởi ie2 vài tháng sau đó.
Landon

8
Tôi đã đổi nó thành [4-8]. Các bản cập nhật của IE ngày càng thường xuyên hơn và tôi thực sự muốn đảm bảo rằng mình không phải thực hiện một thay đổi tương tự trong suốt vòng đời của ứng dụng web mà tôi đang làm việc (vì nó chỉ có tuổi thọ 3 năm). Nếu ai đó đang duyệt web bằng IE 5 trở xuống, họ gặp nhiều vấn đề hơn là xem ứng dụng web của tôi.
Adam Erstelle

2
Nếu bạn chỉ thêm một dấu chấm, nó sẽ kiểm tra các phiên bản số thấp hơn mà không kiểm tra phiên bản 10, 20, v.v.'/(?i)msie [1-8]\./'
michaellindahl

85

Một phiên bản sẽ tiếp tục hoạt động với cả IE10 và 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
Tôi không chắc tại sao bạn lại sử dụng câu lệnh switch khi nó có vẻ như if / then sẽ thích hợp hơn, nhưng điều này hoạt động rất tốt. Và dường như bạn là người duy nhất đọc được rằng OP muốn hỗ trợ phiên bản riêng biệt.
Jake

chúng tôi thực sự phải nhắm mục tiêu IE bao gồm 11 và điều này hoạt động tốt
code_monk

Các thiết bị mới hơn có thể có các thuộc tính khác nhau trong tác nhân người dùng IE11, như được đề cập ở đây: github.com/woothee/woothee-java/issues/6. Để khắc phục điều đó, biểu thức chính quy phải được thay đổi thành:, Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)$version = $matches[1];nên được đổi thành $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Bạn có thể xem ví dụ về regex tại đây: regexr.com/3fb4k.
jdgregson 21/02/17

16

Bạn có thể kiểm tra biến máy chủ HTTP_USER_AGENT. Tác nhân người dùng do IE chuyển giao có chứa MSIE

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

Đối với các phiên bản cụ thể, bạn có thể mở rộng điều kiện của mình

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

Cũng xem câu hỏi liên quan này .


@dixus cho IE11, bạn phải làm điều nàypreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

Đây là một tài nguyên tuyệt vời để phát hiện trình duyệt trong php: http://php.net/manual/en/ Chức năng.get-browser.php

Đây là một trong những ví dụ có vẻ đơn giản nhất:

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

Sau đó, trong mã của bạn, bạn có thể nói điều gì đó như

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

1
Có bất kỳ lý do gì để đặt $ ub, và sau đó trả lại nó ở cuối. Chắc chắn sẽ hiệu quả hơn (bỏ qua một số if không cần thiết) để trả về tên của trình duyệt thay vì đặt biến.
w4etwetewtwet

1
Một số thử nghiệm trình duyệt cổ phiếu, đơn giản, nhưng nó không thực hiện các phiên bản như yêu cầu ...
Jake

chrome useragent chứa safari. vì vậy thử nghiệm trên nên báo cáo chrome là safari. thứ tự nên được đảo ngược. kiểm tra từ khóa chrome đầu tiên.
Joe trung bình

10

tôi làm việc này

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

Tôi thích phiên bản này và đã sửa đổi nó để đưa vào IE11 trên Windows 8.1.
Mike Kormendy

5

PHP có một hàm gọi là get_browser () sẽ trả về một đối tượng (hoặc mảng nếu bạn chọn) với thông tin chi tiết về trình duyệt của người dùng và những gì nó có thể làm.

Một cái nhìn đơn giản đã cho tôi mã này:

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

Đây không phải là cách chắc chắn (vì nó đọc từ HTTP_USER_AGENT , có thể bị giả mạo và đôi khi sẽ bị php phân tích sai), nhưng đó là cách dễ nhất mà bạn có thể tìm thấy theo như tôi biết.


2
yêu cầu cấu hình phía máy chủ để hoạt động. Tôi không chắc chắn như thế nào đáng tin cậy nó là dành cho các sản phẩm chạy trên các máy chủ khác nhau
latvian

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

Điều này không khớp với các phiên bản (và sẽ khớp với IE 10, v.v.)
Oytun


4

Đây là một hàm php nhỏ mà tôi đã viết sử dụng regex trực tiếp từ mã đánh giá javascript được đề xuất của MSFT từ bài viết này: 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

Chỉ kiểm tra MSIE là không đủ để phát hiện IE. Bạn cũng cần "Trident" chỉ được sử dụng trong IE11. Vì vậy, đây là giải pháp của tôi đã hoạt động từ phiên bản 8 đến 11.

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

Vui lòng xem tiêu đề câu hỏi.
Jamie Barker

2

Bạn có thể làm điều này thông qua phân tích cú pháp tiêu đề tác nhân người dùng:

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

Hãy cảnh giác rằng điều này không đáng tin cậy lắm và có thể bị giả mạo đáng kể.


Chỉ cần nhớ rằng User Agentcó thể được làm giả.
drudge

7
Nếu người dùng muốn giả mạo của họ User-Agent, họ muốn truy xuất nội dung của trang như thể đó thực sự là tác nhân người dùng của họ. Kết quả là những gì họ yêu cầu. Không có vấn đề gì ở đây.
Các cuộc đua ánh sáng trong quỹ đạo

2

'HTTP_USER_AGENT' Nội dung của Tác nhân người dùng: tiêu đề từ yêu cầu hiện tại, nếu có. Đây là một chuỗi biểu thị tác nhân người dùng đang truy cập trang. Ví dụ điển hình là: Mozilla / 4.5 [en] (X11; U; Linux 2.2.9 i586). Trong số những thứ khác, bạn có thể sử dụng giá trị này với get_browser () để điều chỉnh đầu ra trang của bạn cho phù hợp với khả năng của tác nhân người dùng.

Vì vậy, tôi giả sử bạn sẽ có thể lấy tên / id trình duyệt từ biến $ _SERVER ["HTTP_USER_AGENT"].


1

Bạn có thể sử dụng một cái gì đó như thế này cho các thư khác nhau hoặc 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]-->

HOẶC sử dụng div khác của 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

nhưng vẫn hữu ích - và hoạt động với IE11! đây là một cách ngắn gọn khác để lấy các trình duyệt phổ biến trả về cho lớp 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;
}

Vì vậy, hàm này trả về: 'safari' hoặc 'firefox' hoặc 'chrome', hoặc 'ie ie8', 'ie ie9', 'ie ie10', 'ie11'.

hy vọng nó giúp


0

Lưu ý trường hợp trong '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

nếu bạn có Internet Explorer 11 và nó đang chạy trên máy tính có màn hình cảm ứng, bạn phải sử dụng: preg_match ('/ Trident / 7.0; Touch; rv: 11.0 /', $ _SERVER ['HTTP_USER_AGENT']) thay vì: preg_match ('/ Trident / 7.0; rv: 11.0 / ', $ _SERVER [' HTTP_USER_AGENT '])


-1

Cách tiếp cận dựa trên tridend sẽ tốt hơn. Đây là một chức năng nhanh để kiểm tra IE 8.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.