0

このコードは、IE8およびその他の古いバージョンのIEでは機能しません。

コードを書き直しましたが、2つのメソッドがありますが、それでも失敗します...

なんで?何が見つかりませんか?

関数を呼び出す方法:

    if (BrowserVersionChecker::is_old_browser()==1) {
//popup here
}

クラス:

<?php

class BrowserVersionChecker {

    /**
      Figure out what browser is used, its version and the platform it is
      running on.

      The following code was ported in part from JQuery v1.3.1
     */
    public static function is_old_browser() {

        $old = 0;

        $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);

        // Identify the browser. Check Opera and Safari first in case of spoof. Let Google Chrome be identified as Safari. 
        if (preg_match('/opera/', $userAgent)) {
            $name = 'opera';
        } elseif (preg_match('/webkit/', $userAgent)) {
            $name = 'safari';
        } elseif (preg_match('/msie/', $userAgent)) {
            $name = 'msie';
        } elseif (preg_match('/mozilla/', $userAgent) && !preg_match('/compatible/', $userAgent)) {
            $name = 'mozilla';
        } else {
            $name = 'unrecognized';
        }

        // What version? 
        if (preg_match('/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches)) {
            $version = $matches[1];
        } else {
            $version = 'unknown';
        }

        // Running on what platform? 
        if (preg_match('/linux/', $userAgent)) {
            $platform = 'linux';
        } elseif (preg_match('/macintosh|mac os x/', $userAgent)) {
            $platform = 'mac';
        } elseif (preg_match('/windows|win32/', $userAgent)) {
            $platform = 'windows';
        } else {
            $platform = 'unrecognized';
        }

        $version = intval($version);

        if (($name == 'opera') && ($version <= 11)) {
            $old = 1;
        }

        if (($name == 'safari') && ($version <= 5)) {
            $old = 1;
        }

        if (($name == 'msie') && ($version <= 8)) {
            $old = 1;
        }

        if (($name == 'mozilla') && ($version <= 7)) {
            $old = 1;
        }

//        $arr = array(
//            'name' => $name,
//            'version' => $version,
//            'platform' => $platform,
//            'userAgent' => $userAgent
//        );
//
//        echo '<pre>';
//        print_r($arr);

        return $old;

//        return array(
//            'name' => $name,
//            'version' => $version,
//            'platform' => $platform,
//            'userAgent' => $userAgent
//        );
    }

    //not used any more - deprecated
    public static function is_old_browser2() {
        $old = 0;

        $browser = get_browser(null, true);
        print_r($browser);

        if (!empty($_SERVER['HTTP_USER_AGENT'])) {
            // IE <= 7
            // User Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.10.229 Version/11.61
            if (preg_match('#msie\s+(\d+)\.(\d+)#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] <= 8) {
                    $old = 1;
                }
            }
            // Firefox <= 7
            // User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
            elseif (preg_match('#Firefox/(\d+)\.(\d+)[\.\d]+#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] <= 7) {
                    $old = 1;
                }
            }
            // Safari < 5
            // User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.52.7 (KHTML, like Gecko) Version/5.1.2 Safari/534.52.7
            elseif (preg_match('#Version/(\d+)[\.\d]+ Safari/[\.\d]+#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] < 5) {
                    $old = 1;
                }
            }
            // opera < 11
            // User Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.10.229 Version/11.61
            elseif (preg_match('#Opera/[\.\d]+.*?Version/(\d+)[\.\d]+#si', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                if ($matches[1] < 11) {
                    $old = 1;
                }
            }
        }

        return $old;
    }

}
4

2 に答える 2

1

特に、ブラウザーごとに異なる出力を提供することが目的である場合は、ブラウザーのチェックにPHPを使用しないことを強くお勧めします。

実際、最近のブラウザチェックは一般的に悪い習慣と見なされています。あなたのコードはそれがjQueryからクリブされたと言っています。jQueryのこの機能はしばらくの間非推奨になり、最近のバージョンから完全に削除されたことを知っておく価値があります。

したがって、PHPコードは、jQueryから削除されたコードに基づいています。これは、彼らがそれを悪い習慣と見なしたためです。それは良くないですね。

では、なぜそれが悪い習慣と見なされるのでしょうか?

まず、ユーザーエージェント文字列は信頼できると見なすべきではありません。非常に簡単になりすまし(ほとんどのブラウザには変更するオプションがあります)、一部のプロキシ、ファイアウォール、匿名ツールによって文字列が変更されたり、完全に削除されたりする可能性があります。あなたはそれが正しいか存在することを信頼することはできません。

第二に、それはとにかく常に役立つとは限りません。たとえば、コードはOperaをチェックします。Operaは現在独自のレンダリングエンジンを使用していますが、まもなくWebkitに切り替えます。これによりブラウザが完全に変更されますが、テストではどちらの方法でも同じ結果が得られます。あまり役に立ちません。また、コードはすべてのWebkitブラウザーがSafariであると想定していますが、これは明らかに間違っています。

コードには、新しいブラウザ、既存のブラウザの将来のバージョン、または新しいレンダリングエンジンに適応する機能がありません。ブラウザの世界は急速に変化しています。あなたのコードはそれに追いつくのに苦労するでしょう。

そして最後に、あなたのコードはさまざまなブラウザのバージョンを「古い」ものとして記述していますが、それらを区別することはありません。Opera 10、IE7、Firefox2の機能は大きく異なります。「古い」ブラウザを入手した場合に何をするつもりかはまだ教えてくれませんが、少なくとも一部のブラウザには不適切である可能性があります。

それで、それが推奨されない場合、代替手段は何ですか?

別の方法は機能テストです。これは通常、ブラウザ自体でJavascriptを使用して行われます。この最良の例は、Modernizrと呼ばれるツールです。これは、ページにプラグインするJavascriptライブラリです。ユーザーのブラウザの機能を分析し、CSSまたはJavascriptで使用できる一連のフラグをサイトに設定します。これにより、ブラウザに特定の機能がない場合に簡単に見つけて、対処することができます。Modernizrサイトには優れたドキュメントがあるので、ここではあまり説明しません。ご覧になることをお勧めします。

「Polyfills」と呼ばれるJavaScriptツールも多数あります。これらのツールは、古いブラウザが使用したい新しい機能のいくつかで動作するように設計されています。必要になる可能性のあるほとんどすべての機能にポリフィルがあるため、特定の機能をサポートしていないブラウザに問題がある場合は、それに対処できる可能性が高くなります。

そして最後に、いくつかのブラウザ機能はとにかく目を見張るものです。丸みを帯びた角やグラデーションなどの機能に問題があり、ページがない場合でもページを使用できる場合は、古いブラウザにそれらを使用せずにページをレンダリングさせることを検討してください。

上記の手法を組み合わせると、非常に高度なサイトを非常に古いブラウザで動作させることができます。

ただし、サーバー側のブラウザ検出を使用する必要があります。これが唯一の方法です。

私の主張を拒否し、それでもPHPでブラウザーのテストを行いたい場合は、PHPが必要な機能を組み込みで提供するため、コードを破棄することをお勧めします。get_browser()関数を検索します。

この関数は、browsecap.ini(別途ダウンロードする必要があります)と呼ばれるブラウザー情報ファイルを使用して、使用されているブラウザーとその機能を判別するのに役立ちます。これらのbrowsecap.iniファイルは簡単にダウンロードでき、さらに重要なことに、新しいブラウザバージョンがリリースされても、ファイルを簡単に最新の状態に保つことができます。(まあ、数ヶ月ごとにコードを書き直すよりも簡単です)。

最新のbrowsecap.iniファイルはここからダウンロードできます:http://tempdownloads.browserscap.com/

(注:これは一時的なURLであり、将来変更される可能性があります。機能しない場合は、お気に入りの検索エンジンにすばやくアクセスすると、browsecap.iniファイルの他のソースが表示されます)

このルートをたどる場合は、この回答の冒頭で私が言ったことを覚えておいてください。ユーザーエージェント文字列の内容に依存することはできません。そのことに注意し、UA文字列が無効であるか、正しくないか、または単に空白である場合に対処する準備をしてください。

最後に、別の注意点として、ユーザーエージェント文字列に応じて異なる出力を提供することを計画している場合は、検索エンジンのランキングに影響を与える可能性があることにも注意する必要があります。特にGoogleは、通常のブラウザとは異なるクローラーの出力を提供するサイトを監視しています。これを「マスキング」と見なし、それを行うサイトに積極的にペナルティを課します。これはあなたが意図していることではありません(あなたは単に異なるブラウザ機能を処理しようとしているだけです)が、Googleがそれを誤って解釈する可能性があるため、それを行う方法と出力の違いに注意する必要がある場合。

それがお役に立てば幸いです。

于 2013-03-19T19:59:20.743 に答える
0

個々の正規表現のケースに対処する代わりに、UA-Parser-jsのようなものを使用してみませんか? JavaScriptベースのユーザーエージェント文字列パーサー(jQueryプラグインとしても利用可能)は、以下を提供しようとします:

  • ブラウザ/バージョン
  • エンジン
  • OS
  • 端末

これは(いくつかの欠陥がありますが)機能しますが、一般的に使用されているブラウザーのバージョンの多くをカバーしています。

于 2013-03-19T14:32:11.347 に答える