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


86

我想在PHP中针对Internet Explorer的不同版本执行以下条件:

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

我在相似的代码上看到了许多变体,但是正在寻找一种超级简单的东西,非常容易编写一些if和else并做不同的事情。

谢谢

编辑:我需要它向用户显示一些不同的消息,所以CSS条件等都是不好的。


4
您是否要提供不同的CSS?在这种情况下,请考虑条件注释。减轻麻烦
Pekka

1
显然IE10不支持条件语句。
CharlieM 2013年

Answers:


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
混沌

2
我认为某些Opera版本会与此匹配,但是可以通过检查“ Opera”将其过滤掉。
利亚姆

45
只需将其更改为即可'/(?i)msie [2-8]/'。您是否真的需要检查1?它于1995年发布,几个月后被ie2取代。
兰登

8
我将其更改为[4-8]。IE更新变得越来越频繁,我真的想确保在我正在开发的Web应用程序的生命周期内不必进行类似的更改(因为它的生命周期只有3年)。如果某人使用IE 5或更低版本的Internet浏览网页,那么与查看我的Web应用程序相比,他们遇到的问题更多。
亚当·埃斯特

2
如果你只需要添加一个时期,它会检查较低的多个版本,但不检查版本10,20,等等'/(?i)msie [1-8]\./'
michaellindahl

85

可以继续与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
我不确定为什么在if / then更合适的情况下为什么要使用switch语句,但是效果很好。显然,您是唯一阅读过OP希望获得单独版本支持的人。
杰克

我们实际上必须将包括11在内的IE定位为目标,并且效果很好
code_monk 2014年

较新的设备在IE11用户代理中可以具有不同的属性,如下所述:github.com/woothee/woothee-java/issues/6。为解决此问题,正则表达式应更改为this Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*),并且$version = $matches[1];应更改为$version = ($matches[2] == 11)?$matches[2]:$matches[1];。您可以在此处查看regex的示例:regexr.com/3fb4k。
jdgregson

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

16

这是检测php中浏览器的好资源:http : //php.net/manual/en/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,然后在最后返回它。当然,返回浏览器的名称而不是设置变量会更有效(跳过一些不必要的)。
w4etwetewtwet

1
一些简单的,通用的浏览器测试,但它没有像请求这样的版本……
Jake

chrome useragent包含野生动物园。因此上述测试应将铬报告为野生动物园。顺序应该相反。首先检查关键字chrome。
平均乔

10

我做这个

$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 2014年

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
需要服务器端配置才能工作。我不确定产品在不同服务器上运行的可靠性如何
拉脱维亚2014年

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

这与版本不符(并且将与IE 10匹配)
Oytun 2015年


4

这是我写的一个小php函数,直接从MSFT建议的javascript嗅探代码中使用正则表达式,该代码来自本文:http : //msdn.microsoft.com/zh-cn/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

仅检查MSIE不足以检测IE。您还需要仅在IE11中使用的“ Trident”。所以这是我的解决方案,适用于版本8至11。

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

请参阅问题标题。
Jamie Barker


2

'HTTP_USER_AGENT'用户代理的内容:当前请求中的标头(如果有)。这是一个字符串,表示正在访问页面的用户代理。一个典型的例子是:Mozilla / 4.5 [en](X11; U; Linux 2.2.9 i586)。除其他外,您可以将此值与get_browser()结合使用,以根据用户代理的功能来调整页面的输出。

因此,我假设您将能够从$ _SERVER [“ HTTP_USER_AGENT”]变量获取浏览器名称/ id。


1

您可以对不同的消息或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]-->

或使用不同的CSS div

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

但仍然有用-并且可以与IE11一起使用!这是获取针对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;
}

因此此函数返回:“ safari”或“ firefox”或“ chrome”,或“ ie ie8”,“ ie ie9”,“ ie ie10”,“ ie ie11”。

希望能帮助到你


0

注意“ 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

如果您具有Internet Explorer 11并且它在触摸屏PC上运行,则必须使用:preg_match('/ Trident / 7.0; Touch; rv:11.0 /',$ _SERVER ['HTTP_USER_AGENT'])代替:preg_match('/ Trident / 7.0; rv:11.0 /',$ _SERVER ['HTTP_USER_AGENT'])


-1

基于三分法的方法会更好。这是检查IE 8的快速功能。

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.