我可以使用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兼容。