PHP: якщо Internet Explorer 6, 7, 8 або 9


86

Я хочу зробити умовний текст у PHP для різних версій Internet Explorer за типом:

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

Я бачив багато варіацій подібного коду, але шукав щось надзвичайно просте, що дуже легко кодувати, щоб зробити деякі прості, якщо інакше, і робити різні речі.

Дякую

РЕДАГУВАТИ: Мені це потрібно, щоб показати кілька різних повідомлень користувачам, тому умовні умови 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]/'. Вам справді потрібно перевірити, тобто 1 ? Він був випущений в 1995 році, а через кілька місяців замінений на ie2.
— Лендон,

8
Я змінив його на [4-8]. Оновлення IE стають дедалі частішими, і я справді хочу переконатися, що мені не доведеться вносити подібні зміни протягом усього терміну роботи веб-програми, над якою я працюю (оскільки тривалість життя триває лише 3 роки). Якщо хтось переглядає веб-сторінки за допомогою IE 5 або менше, у них на ШАХ більше проблем, ніж при перегляді мого веб-додатку.
— Адам Ерстель

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, коли це здається більш відповідним, якщо / тоді, але це спрацювало чудово. І, мабуть, ви були єдиним, хто читав, що ОП хоче окрему підтримку версій.
— Джейк

нам фактично довелося націлити IE, включаючи 11, і це працювало чудово
— code_monk

Нові пристрої можуть мати різні атрибути в агенті користувача IE11, як згадано тут: github.com/woothee/woothee-java/issues/6. Щоб це виправити, регулярний вираз слід змінити на this: 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'])
— Андрес СК

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, а потім повернути його наприкінці. Звичайно, ефективніше (пропускаючи деякі непотрібні, якщо) повертати ім'я браузера, а не встановлювати змінну.
— w4etwetewtwet

1
Деякі прості, тестові тестування браузера, але вони не виконують таких версій, як запит ...
— Джейк

хромсерагент містить сафарі. так вище тест повинен повідомити хром як сафарі. порядок слід змінити. спочатку перевірте ключове слово 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.
— Mike Kormendy

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

Ви також можете заглянути на PHP get_browser(); http://php.net/manual/en/function.get-browser.php

Можливо, вам це буде корисно для більшої кількості функцій.


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. Вам також потрібен "Тризуб", який використовується лише в IE11. Тож ось моє рішення, яке працювало у версіях 8 - 11.

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

Будь ласка, див. Назву запитання.
— Jamie Barker

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', 'ie ie9', 'ie ie10', 'ie 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.