【问题标题】:Can I detect IE6 with PHP?我可以用 PHP 检测 IE6 吗?
【发布时间】:2010-10-14 21:17:27
【问题描述】:

有没有办法使用 PHP 来检测页面是否正在使用 IE6 加载?

【问题讨论】:

  • 您想这样做有什么特别的原因吗?
  • 哈哈让我们杀了ie6 bringdownie6.com
  • 因为它的开发既旧又费时,有时您只想将它​​们重定向到您网站的一个糟糕的旧版本。
  • 我想在我的网站上添加一条消息,让 IE6 用户告诉他们已经更新他们的垃圾。

标签: php internet-explorer-6 cross-browser


【解决方案1】:

尝试检查他们的用户代理是否有'MSIE 6.'

$using_ie6 = (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== FALSE);

这是基于this user agent information

【讨论】:

  • 这通常也会匹配 Opera,因为 Opera 经常在其用户代理字符串中添加“MSIE 6.0”。
  • Opera 的最新版本(默认情况下)在用户代理字符串中没有 MSIE 6.0
  • 就我而言,这对所有 MSIE 浏览器都是误报,因为它们都列出了“MSIE 6.0 兼容”,即使它们的版本实际上更高。
  • @thomasrutter - 只需将&& !strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') 添加到您的if 条件
【解决方案2】:

您可以通过这种方式检测带有 HTML 的 IE6

<!--[if IE 6]>
// ie6 only stuff here
<![endif]-->

Here's a link on how it's done in PHPWay Back Machine 但我在为 IE6 解析 $_SERVER["HTTP_USER_AGENT"] 时看到了很多误报

【讨论】:

  • 这有时可能很有用,但它实际上并不是问题的答案。它询问如何使用 PHP 执行此操作。用户代理可能是 IE,但它可能不会呈现 HTML。
【解决方案3】:

此页面上的许多基于用户代理的答案都不太可靠,因为 Opera 经常使用包含“MSIE 6.0”的用户代理字符串来标识自己,例如:

Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.51

这会影响 Opera 5 到 9 甚至 Opera 10 的所有版本,并且可以在 Opera 中打开或关闭。 See this page.

我见过的一种常见方法是测试“MSIE”和“Opera”。例如,

if (preg_match('/\bmsie 6/i', $ua) && !preg_match('/\bopera/i', $ua))
  echo "We have IE6!";

【讨论】:

  • $ua = $_SERVER['HTTP_USER_AGENT']; if (preg_match('/\bmsie [56]\./i', $ua) && !preg_match('/\b(opera|msie [789])/i', $ua)) { echo 'IE 5 或6'; }
  • strpos() 会在这里更快地完成这项工作。
【解决方案4】:

好吧PHLAK...

我认为这个更好:P

  if(preg_match('/msie [2-6]/i',$_SERVER['HTTP_USER_AGENT'])) {
   // if IE<=6
  } else {
   //if IE>6
  }

【讨论】:

  • 效果很好,除了“preg”应该是“preg_match”。
  • 语法'/msie [1-6]/i' 更短,可能对大多数人来说更熟悉。
  • 是的,你说得对 :) 但那是 3 年前的事了,现在我的正则表达式技能比那时要好得多;)
  • 请注意,此方法会错误地将 IE10 识别为匹配项。
  • //if IE&gt;6 评论具有误导性。其他所有浏览器都会匹配失败。
【解决方案5】:

您可以将get_browserupdated browscap.ini file 一起使用。

【讨论】:

  • 这听起来很有趣,我试试看。
【解决方案6】:

就像其他人所说的那样,只检查用户代理就会出现误报......所以为什么不使用 both,用户代理检查和条件评论。

例如...

<? if (preg_match('/\bmsie 6/i', $_SERVER['HTTP_USER_AGENT']) { ?>
  <!--[if IE 6]>
    // ie6 only stuff here
  <![endif]-->
<? } ?>

这样您就不会将这些不必要的代码发送回大多数浏览器...但在误报的情况下仍然是安全的。

【讨论】:

    【解决方案7】:

    可以,使用 HTTP User-Agent 标头,但如果可能,我强烈建议不要这样做。 User-Agent 标头非常难以准确解析,并且通过简单的字符串匹配往往会出现误报 - 甚至忽略浏览器冒充其他浏览器的问题。例如 Jeremy 的“MSIE 6”。 string 将匹配 IE Mobile,这与 IE6 非常不同,您通常不想将它们混为一谈。

    另外,当您将不同的 HTML 发送到不同的浏览器时,您必须使用“Vary”标头(这会降低缓存的效率)以避免缓存将错误的页面发送到不同的浏览器。

    因此,如果您能找到另一个地方进行浏览器差异化,那绝对是最好的。 Ólafur 的条件 cmets 方法通常是更改 JavaScript 和 HTML 标记/CSS 链接的最简单方法。

    【讨论】:

      【解决方案8】:

      您可以将它用于许多浏览器,但它很耗时,有时还会误报...

      function do_stylesheet_link() {
      // Picks up appropriate css file depending on the user-agent
      
      //  if ( stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox') ) {
      //echo '<link rel="stylesheet" href="css/firefox.css" type="text/css" />'; }    
      
      //elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Chrome') ) {
      //echo '<link rel="stylesheet" href="css/chrome.css" type="text/css" />'; }
      
      //elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {
      //echo '<link rel="stylesheet" href="css/safari.css" type="text/css" />'; }
      
      //elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Opera') ) {
      //echo '<link rel="stylesheet" href="css/opera.css" type="text/css" />'; }
      
          if ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') )  {
      echo '<link rel="stylesheet" href="css/ie6.css" type="text/css" />'; }
      
      elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.') ) {
      echo '<link rel="stylesheet" href="css/ie7.css" type="text/css" />'; }
      
      elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 8.') ) {
      echo '<link rel="stylesheet" href="css/ie8.css" type="text/css" />'; }
      
      else {
      echo '<link rel="stylesheet" href="css/style.css" type="text/css" />';
      }
      

      }

      【讨论】:

        【解决方案9】:

        if(substr($_SERVER['HTTP_USER_AGENT'],0,34)=="Mozilla/4.0 (compatible; MSIE 6.0;") echo "I am stupid IE6";

        IE 6 总是以“Mozilla/4.0 (compatible; MSIE 6.0;" IE 7,8 中间有“MSIE 6”...

        【讨论】:

          【解决方案10】:

          谢谢大家,我最终创建了以下函数并根据需要调用它:

          // IE6 Check
          function isIE() {
            $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
            if (ereg("msie 6.0", $userAgent)) {
              return true;
            } else {
              return false;
            }
          }
          

          【讨论】:

          • 快速提示:使用 PHP 中的 preg 函数代替 ereg,它们更快。 uk.php.net/manual/en/function.preg-match.php
          • 从头开始,如果您只是检查字符串是否存在,则根本不应该使用正则表达式函数。按照上面的答案使用 strpos。
          【解决方案11】:

          列出的方法通常会标记带有某些插件(例如 MathPlayer;以及一些恶意软件工具栏)的浏览器。

          我发现一个更可靠的方法是:

          if( preg_match('/^Mozilla\/4\.0 \(compatible; MSIE 6/', $_SERVER['HTTP_USER_AGENT']) != 0 )
          

          【讨论】:

          • 如果检测到IE6,if中的sn-p返回TRUE。
          【解决方案12】:

          更简单的:

          if(stristr(strtolower($_SERVER['HTTP_USER_AGENT']), "msie 6.0")) {
              // IE6? Aren't you out of fashion yet?
          }
          

          【讨论】:

            【解决方案13】:
            function isIE($versions=array()) {
                if (!empty($versions))
                    $versions = '('.implode('|',$versions).')';
                else
                    $versions = '1?\d';
                $ua = $_SERVER['HTTP_USER_AGENT'];
                $is_not_opera = false===stripos($ua, 'opera');
                return $is_not_opera && preg_match('/\bmsie '.$versions.'\./i', $ua);
            }
            

            使用:

            $is_ie = isIE(); //Any version
            $is_ie_7 = isIE(array(7)); //IE 7
            $is_old_id = isIE(array(6,7));//IE 7 and 8
            

            【讨论】:

              【解决方案14】:
              function isOldIE() {
                  // don't support IE6 or below
                  return preg_match('/MSIE [1-6]/', $_SERVER['HTTP_USER_AGENT']);
              }
              

              【讨论】:

                【解决方案15】:

                非常有用的线程。我用它来隐藏 IE6 的 &lt;?xml&gt; 声明。结果 IE6 只检查文档的第一行以进行 doctype 嗅探,这意味着如果存在 &lt;?xml&gt; 字符串,IE6 将以怪异模式呈现,而不管 &lt;?xml&gt; 声明后面的 doctype 是什么

                我不确定包含歌剧检查是否重要,但无论如何都包含它。

                //check if IE 6 or less
                $not_lte_ie6 = true;
                $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
                if(strpos($ua,'msie') !== FALSE) {
                    if(strpos($ua,'opera') === FALSE) {
                        if(preg_match('/(?i)msie [1-6]/',$ua)) $not_lte_ie6 = false;
                    }
                }
                if ($not_lte_ie6)
                    echo "<?xml version='1.0' encoding='UTF-8'?>\n";
                

                【讨论】:

                  【解决方案16】:

                  函数是preg_match()而不是preg(),但是很好!

                  【讨论】:

                    【解决方案17】:

                    注意 IE8 还在其用户代理字符串中指定它与 IE6 兼容。

                    【讨论】:

                    • 我最近发现这是真的,当时有用户联系我说他们使用的是 IE8,但我检测到它是 IE6。他们的用户代理字符串是这样的:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 5.1;Trident/4.0;Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.1;SV1);.NET CLR 2.0.50727)
                    • 我研究了这个,似乎只有在 IE 处于兼容性视图时才会发生。
                    猜你喜欢
                    • 2010-09-21
                    • 2010-09-08
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-12
                    • 2018-03-28
                    • 2010-10-09
                    • 2016-01-11
                    • 1970-01-01
                    相关资源
                    最近更新 更多