PHP:如果是Internet Explorer 6、7、8或9

87

我想在 PHP 中按照以下方式对不同版本的Internet Explorer进行条件判断:

if($browser == ie6){ //执行这个代码} elseif($browser == ie7) { //执行这个代码 } elseif...

我已经看到过许多类似代码的变体,但是我正在寻找一些非常简单易懂的代码来执行一些简单的 if 和 else,从而执行不同的操作。

谢谢

编辑:我需要展示一些不同的消息给用户,因此 CSS 的条件语句等都不太适用。


4
你是否希望为不同的CSS提供服务?如果是这样,请考虑使用条件注释。这样会更方便。 - Pekka
1
显然,IE10不支持条件语句。 - CharlieM
17个回答

130

这是我最终所使用的变体,它检查IE8及以下版本:

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
此模式将把Internet Explorer 10识别为Internet Explorer 1。 - chaos
2
我认为一些版本的Opera会匹配这个,但是可以通过检查“Opera”来过滤它们。 - Liam
45
将其更改为 '/(?i)msie [2-8] /'。你真的需要检查 IE 1 吗?它于1995年发布,几个月后就被IE2取代了。 - Landon
8
我将其更改为[4-8]。IE 更新越来越频繁,我真的希望确保在我正在开发的 Web 应用程序的寿命内(仅有 3 年)不必进行类似的更改。如果有人使用 IE5 或更早的版本浏览网页,他们遇到的问题远比查看我的 Web 应用程序要多得多。 - Adam Erstelle
2
如果只添加一个句点,它将检查较低版本的数字而不检查版本10、20等。'/(?i)msie [1-8]\./' - michaellindahl
显示剩余3条评论

86

一个能够在IE10和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
我不确定为什么你使用了 switch 语句,因为 if/then 似乎更合适,但这个方法很好用。显然,你是唯一一个读懂 OP 想要分离版本支持的人。 - Jake
我们实际上需要针对包括IE 11在内的浏览器进行目标定位,这个方法非常有效。 - code_monk
新设备在IE11用户代理中可能具有不同的属性,如此处所述:github.com/woothee/woothee-java/issues/6。为了解决这个问题,正则表达式应该改为:Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*),并且$version = $matches[1]; 应该改为 $version = ($matches[2] == 11)?$matches[2]:$matches[1];。您可以在这里查看正则表达式的示例:regexr.com/3fb4k。 - jdgregson

16

这是一个很好的用于在PHP中检测浏览器的资源:http://php.net/manual/zh/function.get-browser.php

这是其中看起来最简单的示例之一:

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

随后在你的代码中,你可以这样说:

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

1
有没有设置$ub并在最后返回它的理由?毫无疑问,与设置变量相比,返回浏览器名称更有效率(跳过了一些不必要的if语句)。 - w4etwetewtwet
1
一些简单的、常规的浏览器测试,但它不像请求那样做版本控制... - Jake
Chrome用户代理包含Safari。因此,上述测试应将Chrome报告为Safari。顺序应该被颠倒。首先检查关键字Chrome。 - Average Joe

16
您可以检查HTTP_USER_AGENT服务器变量。IE传输的用户代理包含MSIE
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { ... }

对于特定版本,您可以扩展条件。

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

还可以看看这个相关的问题


@dixus 对于IE11,您需要执行以下操作:preg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT']) - Andres SK

11

我这样做

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

我喜欢这个版本,并对其进行了修改,以包括适用于Windows 8.1上的IE11浏览器。 - Mike Kormendy

5

PHP有一个名为get_browser()的函数,它将返回一个对象(或数组,如果您选择的话),其中包含有关用户浏览器及其功能的详细信息。

简单查看后,我得到了以下代码:

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

这不是一种百分之百可靠的方法(因为它从 HTTP_USER_AGENT 读取,该信息可以被伪造,并且有时会被php错误地分析),但据我所知,这是最简单的方法。


2
需要进行服务器端配置才能正常工作。我不确定产品在不同服务器上运行的可靠性如何。 - latvian

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

这不匹配版本(并将匹配IE 10等) - Oytun

4

这里是我编写的一个小 PHP 函数,它直接使用了 MSFT 建议的 JavaScript 探测代码中的正则表达式。相关文章链接为: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;

}

4

3
不错,但它需要在你的php.ini文件中进行设置,这可能对一些用户来说是一个问题。 - Jake

3

仅检测 MSIE 并不能足以检测 IE。您还需要检测“Trident”,该项仅在 IE11 中使用。因此,以下是我的解决方案,适用于版本 8 到 11。

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

请参见问题标题。 - Jamie Barker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接