我可以使用PHP检测IE6吗?

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

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

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

这是基于这个用户代理信息 。

这样可以用HTML检测IE6

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

这里有一个关于如何在PHP Way Back Machine中 完成的链接,但是我在parsing$_SERVER["HTTP_USER_AGENT"]$_SERVER["HTTP_USER_AGENT"]看到了很多误报

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

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

这会影响所有版本的Opera 5到9甚至Opera 10,并且可以在Opera中打开或closures。 看到这个页面 。

我见过的一个常见方法是testing“MSIE”和“Opera”。 例如,

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

以及PHLAK …

我认为这一个更好:P

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

您可以使用更新的browscap.ini文件的 get_browser 。

就像其他人所说的那样,仅仅通过检查用户代理就会有误报……所以为什么不同时使用用户代理检查和条件注释。

例如…

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

这样你就不会把这个不必要的代码发回给大多数浏览器……但是在误报的情况下仍然是安全的。

可以使用HTTP User-Agent头,但是我强烈build议不要这样做,如果可能的话。 User-Agent头非常难以准确地parsing,并且通过简单的string匹配往往会导致错误的肯定 – 甚至忽略假装为其他浏览器的浏览器的问题。 例如,Jeremy的“MSIE 6.”string将会匹配IE Mobile,这与IE6非常不同,您通常不想将它们混淆。

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

所以,如果你可以find另一个地方做浏览器分化,那绝对是最好的。 Ólafur的条件注释方法通常是更改JavaScript和HTML标记/ CSS链接的最简单的方法。

你可以在很多浏览器上使用它,但是这很费时间,有时候会误报

 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" />'; } 

}

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(兼容; MSIE 6.0;”IE 7,8在中间有“MSIE 6”

谢谢你们,我最终创build了以下函数并根据需要调用它:

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

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

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

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

更简单一些:

 if(stristr(strtolower($_SERVER['HTTP_USER_AGENT']), "msie 6.0")) { // IE6? Aren't you out of fashion yet? } 
 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 
 function isOldIE() { // don't support IE6 or below return preg_match('/MSIE [1-6]/', $_SERVER['HTTP_USER_AGENT']); } 

很有帮助的线程。 我用这个来隐藏IE6的<?xml>声明。 原来IE6只检查文档的第一行是否为doctype嗅探,这意味着如果存在<?xml>string,IE6将以怪癖模式呈现,而不pipe在<?xml>声明之后的文档types

我不确定是否包括歌剧检查的关键,但无论如何也包括在内。

 //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"; 

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

注意IE8还指定它的用户代理string与IE6兼容。