PHP : Internet Explorer 6, 7, 8 또는 9 인 경우


86

다음 줄에 따라 다른 버전의 Internet Explorer에 대해 PHP에서 조건부를 수행하고 싶습니다.

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

비슷한 코드에서 많은 변형을 보았지만 간단한 if 및 else 작업을 수행하고 다른 작업을 수행하기 위해 코딩하기 매우 쉬운 매우 간단한 것을 찾고 있습니다.

감사

편집 : 사용자에게 다른 메시지를 표시하려면 CSS 조건 등이 좋지 않습니다.


4
다른 CSS를 제공하고 싶으십니까? 이 경우 조건부 주석을 고려하십시오 . 덜 번거 로움
— Pekka 2011 년

1
분명히 IE10은 조건문을 지원하지 않습니다.
— CharlieM 2013-04-22

답변:


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로 인식합니다.
— chaos

2
Opera의 일부 버전이 이것과 일치 할 것이라고 생각하지만 'Opera'를 확인하여 필터링 할 수 있습니다.
— Liam

45
그냥로 변경하십시오 '/(?i)msie [2-8]/'. ie 1 을 확인해야 합니까? 1995 년에 출시되었고 몇 달 후 ie2로 대체되었습니다.
— Landon

8
[4-8]로 변경했습니다. IE 업데이트가 점점 더 자주 발생하고 있으며 작업중인 웹 앱의 수명 동안 비슷한 변경을 수행 할 필요가 없는지 확인하고 싶습니다 (수명은 3 년에 불과하므로). 누군가 IE 5 이하로 웹을 검색하는 경우 내 웹 앱을 보는 것보다 훨씬 더 많은 문제가 있습니다.
— Adam Erstelle 2013

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
if / then이 더 적절 해 보일 때 왜 switch 문을 사용했는지 잘 모르겠지만 이것은 훌륭하게 작동했습니다. 그리고 분명히 당신은 OP가 별도의 버전 지원을 원한다는 것을 읽은 유일한 사람이었습니다.
— Jake

우리는 실제로 11을 포함하는 IE를 대상으로해야했고 이것은 아름답게 작동했습니다
— code_monk 2014 년

최신 장치는 여기에 언급 된대로 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];. 여기에서 regex의 예를 볼 수 있습니다. 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) { ... }

이 관련 질문 도 참조하십시오 .


당신이 IE11에 대한 @dixus는이 작업을 수행하는preg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
— 안드레스 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를 설정 한 다음 끝에 반환 할 이유가 있습니까? 변수를 설정하는 대신 브라우저의 이름을 반환하는 것이 더 효율적입니다 (불필요한 경우 생략).
— w4etwetewtwet 2013 년

1
몇 가지 간단한 재고 브라우저 테스트이지만 요청과 같은 버전은 수행하지 않습니다 ...
— Jake

크롬 사용자 에이전트에는 사파리가 포함되어 있습니다. 위의 테스트는 크롬을 사파리로보고해야합니다. 순서를 반대로해야합니다. 먼저 키워드 크롬을 확인하십시오.
— 평균 Joe

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
}

이 버전이 마음에 들었고 Windows 8.1의 IE11에 포함되도록 수정했습니다.
— Mike Kormendy 2014

5

PHP는 get_browser () 라는 함수를 가지고 있습니다.이 함수 는 사용자의 브라우저에 대한 세부 정보와 할 수있는 작업과 함께 객체 (또는 원하는 경우 배열 ) 를 반환합니다.

간단히 살펴보면 다음 코드가 제공됩니다.

$browser = get_browser( null, true );
if( $browser['name'] == "Firefox" )
    if( $browser['majorversion'] == 4 )
        echo "You're using Firefox version 4!";

이것은 확실한 방법은 아니지만 ( 스푸핑 될 수 있고 때로는 php에 의해 잘못 분석 될 수있는 HTTP_USER_AGENT 에서 읽음 ), 내가 아는 한 가장 쉽게 찾을 수있는 방법입니다.


2
작동하려면 서버 측 구성이 필요합니다. 다른 서버에서 제품을 실행하는 것이 얼마나 신뢰할 수 있는지 잘 모르겠습니다
— latvian

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

버전과 일치하지 않음 (IE 10 등과 일치)
— Oytun


4

다음은이 기사에서 MSFT가 제안한 자바 스크립트 스니핑 코드에서 직접 정규식을 사용하는 약간의 PHP 함수입니다. 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에서만 사용되는 "Trident"도 필요합니다. 그래서 여기에 버전 8에서 11까지 작동하는 내 솔루션이 있습니다.

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

질문 제목을 참조하십시오.
— Jamie Barker

2

user-agent 헤더를 구문 분석하여이를 수행 할 수 있습니다.

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

이것은 매우 신뢰할 수 없으며 사소하게 스푸핑 될 수 있습니다.


User Agent가짜 일 수 있다는 것을 기억하십시오 .
— 2011 년

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"] 변수에서 브라우저 이름 / ID를 가져올 수 있다고 가정합니다.


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

'Trident'의 경우를 확인하십시오.

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이 있고 터치 스크린 PC에서 실행중인 경우에는 preg_match ( '/ 대신 preg_match ('/ Trident / 7.0; Touch; rv : 11.0 / ', $ _SERVER ['HTTP_USER_AGENT '])를 사용해야합니다. Trident / 7.0; rv : 11.0 / ', $ _SERVER ['HTTP_USER_AGENT '])


-1

tridend 기반 접근 방식이 더 좋습니다. 다음은 IE 8을 확인하는 빠른 기능입니다.

<?php
function is_IE8(){
   if(strpos(str_replace(' ', '', $_SERVER['HTTP_USER_AGENT']),'Trident/4.0')!== FALSE){
       return TRUE;
   };
   return FALSE; 
} 
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.