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

Posted

技术标签:

【中文标题】PHP:如果 Internet Explorer 6、7、8 或 9【英文标题】:PHP: If internet explorer 6, 7, 8 , or 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不支持条件语句。 【参考方案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\/\d1,2.\d1,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\/\d1,2.\d1,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,他们想要检索页面的内容,就好像那真的是他们的用户代理一样。结果就是他们所要求的。这里没问题。

以上是关于PHP:如果 Internet Explorer 6、7、8 或 9的主要内容,如果未能解决你的问题,请参考以下文章

CSS Imagenes PHP透明度Internet Explorer

Internet Explorer中的Imagenes PHP透明

Internet Explorer 上的 CSS 错误阴影效果(纸张卷曲)

如何使用 javascript 或 php 禁用 Internet Explorer 缓存

PHP UFT8编码Internet Explorer问题[重复]

Internet Explorer 9 中 iframe 的 P3P 和 PHP 会话问题