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


86

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

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

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

Благодарность

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


4
Вы хотите использовать другой CSS? В таком случае рассмотрите условные комментарии . Меньше хлопот
Пекка

1
Очевидно IE10 не поддерживает условные операторы.
CharlieM

Ответы:


130

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

75
Этот шаблон распознает Internet Explorer 10 как Internet Explorer 1.
хаос

2
Я думаю, что некоторые версии Opera будут соответствовать этому, но их можно отфильтровать, отметив «Opera».
Лиам,

45
просто измените его на '/(?i)msie [2-8]/'. Вам действительно нужно проверить ie 1 ? Он был выпущен в 1995 году и через несколько месяцев был заменен на ie2.
Лэндон

8
Я изменил его на [4-8]. Обновления IE становятся все более и более частыми, и я действительно хочу быть уверен, что мне не придется вносить аналогичные изменения в течение всего срока службы веб-приложения, над которым я работаю (поскольку у него срок службы всего 3 года). Если кто-то просматривает Интернет с помощью IE 5 или ниже, у него НАМНОГО больше проблем, чем при просмотре моего веб-приложения.
Adam Erstelle

2
Если вы просто добавите точку, он проверит версии с меньшим номером без проверки версии 10, 20 и т. Д.'/(?i)msie [1-8]\./'
michaellindahl

85

Версия, которая продолжит работать как с 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
  }
}

2
Я не уверен, почему вы использовали оператор switch, когда кажется, что if / then было бы более подходящим, но это сработало отлично. И, видимо, вы были единственным, кто прочитал, что OP требует поддержки отдельной версии.
Джейк

на самом деле нам пришлось настроить таргетинг на IE, включая 11, и это прекрасно сработало
code_monk

Новые устройства могут иметь разные атрибуты в пользовательском агенте IE11, как упоминалось здесь: github.com/woothee/woothee-java/issues/6. Чтобы исправить это, следует заменить регулярное выражение на это: Trident\/\d{1,2}.\d{1,2};(.*)rv:([0-9]*)и $version = $matches[1];на $version = ($matches[2] == 11)?$matches[2]:$matches[1];. Вы можете увидеть пример регулярного выражения здесь: regexr.com/3fb4k.
jdgregson

16

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

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

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

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

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


@dixus для IE11, вы должны это сделатьpreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

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

1
Есть ли причина устанавливать $ ub, а затем возвращать его в конце. Конечно, более эффективно (пропускает некоторые ненужные if) возвращать имя браузера вместо установки переменной.
w4etwetewtwet

1
Некоторое простое стандартное тестирование браузера, но оно не выполняет версии, подобные запросу ...
Джейк,

chrome useragent содержит сафари. поэтому приведенный выше тест должен сообщать хром как сафари. порядок должен быть обратным. сначала проверьте ключевое слово chrome.
Средний Джо

10

я делаю это

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

Мне нравится эта версия, и я изменил ее, включив в нее IE11 в Windows 8.1.
Майк Корменди

5

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


2
для работы требуются конфигурации на стороне сервера. Я не уверен, насколько надежно для продуктов работать на разных серверах
латвийский

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

Это не соответствует версиям (и будет соответствовать IE 10 и т. Д.)
Ойтун

4

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

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


3
Аккуратно. Но для этого требуется настройка в вашем php.ini, что может быть проблемой для некоторых пользователей.
Джейк

4

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

}

3

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

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

См. Заголовок вопроса.
Джейми Баркер,

2

Вы можете сделать это, проанализировав заголовок пользовательского агента:

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

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


Просто помните, что это User Agentможно подделать.
drudge

7
Если пользователь хочет их подделать User-Agent, он хочет получить содержимое страницы, как если бы это был его пользовательский агент. Результат - то, о чем они просили. Здесь нет проблем.
Гонки за легкостью на орбите,

2

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

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


1

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

1

но все же полезно - и работает с 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', 'ie9', 'ie10', 'ie11'.

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


0

Обратите внимание на случай в «Трезубце»:

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

0

если у вас 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 '])


-1

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

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.