【问题标题】:PHP: If internet explorer 6, 7, 8 , or 9PHP:如果 Internet Explorer 6、7、8 或 9
【发布时间】:2011-07-15 05:02:28
【问题描述】:

我想在 PHP 中为不同版本的 Internet Explorer 做一个条件:

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

我已经看到类似代码的许多变体,但正在寻找一些超级简单的东西,很容易编码来做一些简单的 if 和 else 并做不同的事情。

谢谢

编辑:我需要它来向用户显示一些不同的消息,因此 CSS 条件等不好。

【问题讨论】:

  • 您是否希望提供不同的 CSS?在这种情况下,请考虑conditional comments。少麻烦
  • 显然IE10不支持条件语句。

标签: php browser


【解决方案1】:

这是我最终使用的一种变体,它检查 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
}

【讨论】:

  • 此模式会将 Internet Explorer 10 识别为 Internet Explorer 1。
  • 我认为某些版本的 Opera 会匹配这个,但是可以通过检查 'Opera' 来过滤掉它们。
  • 只需将其更改为'/(?i)msie [2-8]/'。你真的需要检查ie 1吗?它于 1995 年发布,几个月后被 ie2 取代。
  • 我把它改成了 [4-8]。 IE 更新越来越频繁,我真的想确保在我正在开发的 Web 应用程序的生命周期内不必进行类似的更改(因为它只有 3 年的生命周期)。如果有人使用 IE 5 或更低版本浏览网页,他们会遇到比查看我的网络应用程序更多的问题。
  • 如果您只是添加一个句点,它将检查较小的版本而不检查版本 10、20 等。'/(?i)msie [1-8]\./'
【解决方案2】:

但仍然有用 - 并且适用于 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' or 'firefox' or 'chrome', or 'ie ie8', 'ie ie9', 'ie ie10', 'ie ie11'.

希望对你有帮助

【讨论】:

    【解决方案3】:
    if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
    // eh, IE found
    }
    

    【讨论】:

    • 这与版本不匹配(将匹配 IE 10 等)
    【解决方案4】:

    如果您有 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'])

    【讨论】:

      【解决方案5】:

      注意“三叉戟”中的情况:

      if (isset($_SERVER['HTTP_USER_AGENT']) &&
          ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false)) {   
           // IE is here :-(
          }
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 请看问题标题。
        【解决方案7】:

        将继续与 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
          }
        }
        

        【讨论】:

        • 我不知道你为什么在 if/then 看起来更合适的时候使用 switch 语句,但这很好用。显然你是唯一一个读到 OP 需要单独版本支持的人。
        • 我们实际上必须以 IE 为目标,包括 11 并且效果很好
        • 较新的设备可以在 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。
        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          这是我编写的一个小 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;
          
          }
          

          【讨论】:

            【解决方案10】:

            您可以将这样的内容用于不同的消息或 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]-->
            

            【讨论】:

              【解决方案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。
              【解决方案12】:

              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 分析错误),但据我所知,这是您能找到的最简单的方法。

              【讨论】:

              • 需要服务器端配置才能工作。我不确定产品在不同服务器上运行有多可靠
              【解决方案13】:

              这是在 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
              }
              

              【讨论】:

              • 有什么理由设置$ub,然后在最后返回。当然,返回浏览器的名称而不是设置变量会更有效(跳过一些不必要的 if)。
              • 一些简单的、常用的浏览器测试,但它不像请求那样做版本......
              • chrome 用户代理包含 safari。所以上面的测试应该将 chrome 报告为 safari。顺序应该颠倒。首先检查关键字 chrome。
              【解决方案14】:

              你也可以看看PHP的get_browser();http://php.net/manual/en/function.get-browser.php

              也许您会发现它对更多功能有用。

              【讨论】:

              • 整洁。但它需要在您的 php.ini 中进行设置,这对某些用户来说可能是个问题。
              【解决方案15】:

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

              所以我假设您可以从 $_SERVER["HTTP_USER_AGENT"] 变量中获取浏览器名称/ID。

              【讨论】:

                【解决方案16】:

                您可以检查 HTTP_USER_AGENT 服务器变量。 IE传输的用户代理包含MSIE

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

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

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

                另见this related question

                【讨论】:

                • @dixus IE11 你必须这样做preg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
                【解决方案17】:

                您可以通过解析用户代理标头来做到这一点:

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

                要小心,这不是很可靠,很容易被欺骗。

                【讨论】:

                • 请记住User Agent 是可以伪造的。
                • 如果用户想要欺骗他们的User-Agent,他们想要检索页面的内容,就好像那真的是他们的用户代理一样。结果就是他们所要求的。这里没问题。
                猜你喜欢
                • 2010-10-09
                • 2012-08-27
                • 2010-09-13
                • 2011-11-06
                • 1970-01-01
                • 2023-04-09
                • 1970-01-01
                • 2012-12-02
                • 2015-04-17
                相关资源
                最近更新 更多