Могу ли я обнаружить IE6 с PHP?

Есть ли способ использовать PHP, чтобы определить, загружается ли страница с использованием IE6?

17 ответов

Решение

Попробуйте проверить их пользовательский агент для 'MSIE 6.',

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

Это основано на этой информации агента пользователя.

Вы можете обнаружить IE6 с HTML таким образом

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

Вот ссылка на то, как это делается в PHP Way Back Machine, но я видел много ложных срабатываний при разборе $_SERVER["HTTP_USER_AGENT"] для IE6

Многие ответы на этой странице, основанные на пользовательском агенте, не слишком надежны, поскольку Opera часто идентифицирует себя с помощью строки пользовательского агента, содержащей "MSIE 6.0", например:

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

Это влияет на все версии Opera с 5 по 9 и даже на Opera 10 и может быть включено или выключено изнутри Opera. Смотрите эту страницу.

Обычный подход, который я видел, состоит в том, чтобы проверить "MSIE" и "Opera". Например,

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

Хорошо ПХЛАК...

я думаю, что этот намного лучше:P

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

Вы можете использовать http://php.net/get_browser с обновленным файлом browscap.ini.

Как и все остальные, ложные срабатывания будут только при проверке пользовательского агента... так почему бы не использовать и проверку пользовательского агента, и условный комментарий.

например...

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

Таким образом, вы не будете отправлять этот ненужный код большинству браузеров... но все равно будете в безопасности в случае ложного срабатывания.

Вы можете, используя HTTP-заголовок User-Agent, но я настоятельно рекомендую не делать этого, если это возможно. Заголовок User-Agent очень очень трудно проанализировать точно и имеет тенденцию к ложным срабатываниям с простым сопоставлением строк - даже игнорируя проблему браузеров, которые претендуют на то, чтобы быть другими браузерами. Например, строка "MSIE 6." Джереми будет соответствовать IE Mobile, который настолько сильно отличается от IE6, что вы, как правило, не хотите их объединять.

Кроме того, когда вы отправляете разный HTML-код в разные браузеры, вы должны использовать заголовок "Vary" (что делает кеши менее эффективными), чтобы избежать того, что кэши отправляют неправильные страницы в разные браузеры.

Так что, если вы можете найти другое место для дифференциации браузера, это определенно лучше. Подход Олафура с условными комментариями обычно является самым простым подходом для изменения ссылок JavaScript и HTML-разметки /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" в середине...

Вы можете использовать его для многих браузеров, но это отнимает много времени и иногда ложно-положительный...

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(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

Спасибо, ребята, в итоге я создал следующую функцию и вызвал ее по мере необходимости:

// 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 )

Очень полезная тема. Я использовал это, чтобы скрыть <?xml> декларация для IE6. Оказывается, IE6 проверяет только первую строку документа на предмет сниффинга, что означает, что если <?xml> строка присутствует, IE6 будет отображаться в режиме причуд независимо от типа документа, следующего за <?xml> декларация

Я не уверен, насколько важно включить проверку оперы, но все равно включил ее.

//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";
function isOldIE() {
    // don't support IE6 or below
    return preg_match('/MSIE [1-6]/', $_SERVER['HTTP_USER_AGENT']);
}

Функция preg_match() вместо preg(), но хорошо!

Примечание. IE8 также указывает, что он совместим с IE6 в своей строке user-agent.

Другие вопросы по тегам