2009-03-23 4 views
48

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

+0

Любая конкретная причина, вы хотите сделать это – staticsan

+4

ха-ха позволяет убить IE6 HTTP : //www.bringdownie6.com/ – lock

+19

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

ответ

65

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

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

Основано на this user agent information.

+8

Это часто совпадает с Opera, потому что Opera часто добавляет «MSIE 6.0» в свою строку user-agent. – thomasrutter

+3

Недавние версии Opera не имеют (по умолчанию) MSIE 6.0 в строке user-agent – philfreo

+2

В моем случае это ложное положительное значение для всех браузеров MSIE, поскольку все они отображают «совместимый с MSIE 6.0», даже если их версия на самом деле выше. – Christian

28

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

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

Here's a link on how it's done in PHPWay Back Machine, но я видел много ложных срабатываний в разборе $_SERVER["HTTP_USER_AGENT"] для IE6

+0

+1 лучший ответ. –

+2

Это может быть полезно иногда, но это не так. на самом деле ответ на вопрос. Он спрашивает, как это сделать с PHP. Пользовательский агент может быть IE, но он может не отображаться HTML. – Fuser97381

3

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

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

Итак, если вы можете найти другое место для дифференциации браузера, это определенно лучше. Подход Ólafur с условными комментариями обычно является самым простым подходом к изменению ссылок JavaScript и HTML разметки/CSS.

1

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

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

Быстрый совет: используйте функции preg в PHP вместо ereg, они быстрее. http://uk.php.net/manual/en/function.preg-match.php – DisgruntledGoat

+4

Поймите, что вы не должны использовать функцию регулярного выражения вообще, если вы проверяете наличие строки. Используйте strpos, как показывает предыдущий ответ. – DisgruntledGoat

15

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

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

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

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

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

$ ua = $ _SERVER ['HTTP_USER_AGENT']; if (preg_match ('/ \ bmsie [56] \ ./ i', $ ua) &&! Preg_match ('/ \ b (opera | msie [789])/i', $ ua)) { echo ' IE 5 или 6 '; } – andrem

+3

strpos() сделает работу быстрее здесь. – Dunhamzzz

12

хорошо PHLAK ...

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

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

Отлично работает, кроме «preg» должно быть «preg_match». – kingjeffrey

+0

sry - i ate _match: P – marverix

+0

Синтаксис ''/msie [1-6]/i'' короче и, вероятно, более известен большинству людей. –

-1

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

-1

Примечание. IE8 также указывает, что он совместим с IE6 в своей строке пользовательского агента.

+0

Я обнаружил, что это правда, когда пользователь связался со мной, чтобы сказать, что они используют IE8, но я обнаружил это как IE6. Их строка агента пользователя: Mozilla/4.0 (совместимо; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (совместимо; MSIE 6.0; Windows NT 5.1; SV1); .NET CLR 2.0.50727) – neave

+0

Я изучал это и кажется, что это происходит только в том случае, если IE находится в режиме совместимости. – Jonathan

0

очень полезная тема. Я использовал это, чтобы скрыть объявление <?xml> для IE6.Оказывается, IE6 проверяет только первую строку документа DOCTYPE нюхают, а это значит, что если <?xml> строка присутствует, IE6 будет оказывать в режиме совместимости независимо от DOCTYPE, следующего за <?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"; 
+0

Разве это не должно быть ===? – Benubird

1

Перечисленные методы будут часто флаг браузеры с определенными плагинов (MathPlayer, например; а также некоторые вредоносные панели инструментов).

я нахожу гораздо более надежным методом является:

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

Фрагмент в if возвращает TRUE, если обнаружен IE6. –

6

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

, например ...

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

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

1

Что-то проще:

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

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

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

}

2

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" в середине ...

1
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 
Смежные вопросы