PHP:Internet Explorer 6、7、8、または9の場合


86

次のように、さまざまなバージョンのInternetExplorerに対してPHPで条件付きを実行したいと思います。

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

私は同様のコードで多くのバリエーションを見てきましたが、コーディングが非常に簡単で、単純なifやelseを実行し、さまざまなことを実行できる非常に単純なものを探しています。

ありがとう

編集:CSS条件などが良くないように、ユーザーにいくつかの異なるメッセージを表示するためにこれが必要です。


4
異なるCSSを提供したいとお考えですか?その場合、条件付きコメントを検討してください。面倒が少ない
Pekka

1
どうやらIE10は条件文をサポートしていません。
charlieM 2013

回答:


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 1としてInternet Explorer 10を認識します
混沌

2
Operaのいくつかのバージョンはこれに一致すると思いますが、「Opera」をチェックすることで除外できます。
リアム

45
に変更するだけ'/(?i)msie [2-8]/'です。あなたは本当にすなわち1をチェックする必要がありますか?1995年にリリースされ、数か月後にie2に置き換えられました。
ランドン2013年

8
[4-8]に変更しました。IEの更新はますます頻繁に行われているので、作業中のWebアプリの存続期間中に同様の変更を加える必要がないことを確認したいと思います(有効期間は3年しかないため)。誰かがIE5以下でWebを閲覧している場合、私のWebアプリを表示するよりもはるかに多くの問題が発生します。
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が個別のバージョンのサポートを望んでいることを読んだのはあなただけでした。
ジェイク

実際には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];。ここで正規表現の例を見ることができます:regexr.com/3fb4k。
jdgregson 2017

16

HTTP_USER_AGENTサーバー変数を確認できます。IEによって転送されたユーザーエージェントにはMSIEが含まれています

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { ... }

特定のバージョンでは、条件を拡張できます

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== false) { ... }

この関連する質問も参照してください。


@dixus for IE11これを行う必要がありますpreg_match('/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'])
Andres SK

16

これは、phpでブラウザを検出するための優れたリソースです:http//php.net/manual/en/function.get-browser.php

最も単純に見える例の1つを次に示します。

<?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
いくつかの単純なストックブラウザテストですが、リクエストのようなバージョンは実行しません...
ジェイク

chromeuseragentにはsafariが含まれています。したがって、上記のテストでは、クロムがサファリとして報告されるはずです。順序を逆にする必要があります。最初にキーワード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
}

私はこのバージョンが好きで、Windows8.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!";

これは確実な方法ではありませんが(HTTP_USER_AGENTから読み取るため、スプーフィングされる可能性があり、phpによって誤って分析されることがあります)、私が知る限り、これは最も簡単な方法です。


2
サーバー側の構成が機能する必要があります。製品が異なるサーバーで実行されることがどれほど信頼できるかわかりません
ラトビア語2014年

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

これはバージョンと一致しません(IE 10などと一致します)
Oytun 2015年


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でのみ使用される「Trident」も必要です。これがバージョン8から11で機能した私のソリューションです。

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

質問のタイトルをご覧ください。
ジェイミーバーカー

2

これは、user-agentヘッダーを解析することで実行できます。

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

これは信頼性が低く、簡単になりすます可能性があることに注意してください。


User Agent偽造できることを覚えておいてください。
2011年

7
ユーザーが自分のをスプーフィングしたい場合は、User-Agentそれが実際にユーザーエージェントであるかのようにページのコンテンツを取得したいと考えています。結果は彼らが求めたものです。ここでは問題ありません。
軌道上でのライトネスレース2011年

2

'HTTP_USER_AGENT' User-Agentの内容:現在のリクエストのヘッダー(存在する場合)。これは、ページにアクセスしているユーザーエージェントを示す文字列です。典型的な例は次のとおりです。Mozilla/ 4.5 [en](X11; U; Linux 2.2.9i586)。特に、この値を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]-->

または、CSSの異なるdivを使用します

<!--[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'、 'ieie11'。

それが役に立てば幸い


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 :-(
    }


-1

トライデンドベースのアプローチの方が良いでしょう。IE8をチェックするための簡単な機能は次のとおりです。

<?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.