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 缓存