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.