PHP: если Internet Explorer 6, 7, 8 или 9

Я хочу сделать условное выражение в PHP для разных версий Internet Explorer в соответствии с:

if($browser == ie6){ //do this} elseif($browser == ie7) { //dothis } elseif...

Я видел много вариаций в похожем коде, но искал что-то сверхпростое, которое очень легко кодировать, чтобы делать простые, если и другие, и делать разные вещи.

Спасибо

РЕДАКТИРОВАТЬ: Мне нужно, чтобы это показывало пользователям несколько разных сообщений, так что условия CSS и т. Д. Не годятся.

17 ответов

Решение

Это то, что я в конечном итоге использовал вариант, который проверяет для 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
}

Версия, которая будет продолжать работать с IE10 и IE11:

preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
if(count($matches)<2){
  preg_match('/Trident\/\d{1,2}.\d{1,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
  }
}

Вы можете проверить переменную сервера HTTP_USER_AGENT. Пользовательский агент, переданный IE, содержит MSIE

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { ... }

Для конкретных версий вы можете продлить свое состояние

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== false) { ... }

Также см. Этот связанный вопрос.

Вот отличный ресурс для обнаружения браузеров в 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
}

Я сделаю это

$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
}

В 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), но это самый простой, который вы можете найти, насколько мне известно.

if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/(?i)msie|trident|edge/",$_SERVER['HTTP_USER_AGENT'])) {
// eh, IE found
}

Вот небольшая 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;

}

Вы также можете посмотреть в PHP get_browser(); http://php.net/manual/en/function.get-browser.php

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

Проверка только на MSIE недостаточна для обнаружения IE. Вам также нужен "Трайдент", который используется только в IE11. Итак, вот мое решение, которое работало версии 8-11.

$agent=strtoupper($_SERVER['HTTP_USER_AGENT']);
$isIE=(strpos($agent,'MSIE')!==false || strpos($agent,'TRIDENT')!==false);

'HTTP_USER_AGENT' Содержимое заголовка User-Agent: из текущего запроса, если он есть. Это строка, обозначающая пользовательский агент, который обращается к странице. Типичный пример: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Среди прочего, вы можете использовать это значение с get_browser(), чтобы адаптировать вывод вашей страницы к возможностям пользовательского агента.

Поэтому я предполагаю, что вы сможете получить имя / идентификатор браузера из переменной $_SERVER["HTTP_USER_AGENT"].

Вы можете сделать это путем анализа заголовка user-agent:

http://php.about.com/od/learnphp/p/http_user_agent.htm

Будьте осторожны, что это не очень надежно и может быть подделано.

Вы можете использовать что-то вроде этого для разных сообщений или 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]-->

ИЛИ использовать другой div из css

<!--[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]-->

Но все же полезно - и работает с 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" или "firefox" или "chrome", или "ie ie8", "ie ie9", "ie ie10", "ie ie11".

Надеюсь, поможет

Если у вас Internet Explorer 11 и он работает на компьютере с сенсорным экраном, вы должны использовать: 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'])

Обратите внимание на случай в "Trident":

if (isset($_SERVER['HTTP_USER_AGENT']) &&
    ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false)) {   
     // IE is here :-(
    }

Подход, основанный на трендах, был бы лучше. Вот быстрая функция для проверки IE 8.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
Другие вопросы по тегам