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.