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;
}
?>