22

PHPを使用して、サーバー側でユーザーエージェントが「Chrome」であるかどうかを知りたいです。リクエストヘッダーからユーザーエージェント文字列を解析するための信頼できる正規表現はありますか?

4

4 に答える 4

31

この時点で、あまりにも多くのブラウザがChromeのふりをして、その人気に乗るだけでなく、「Chrome」の単純な一致を有効にするためのブラウザ検出の乱用と戦っています。今後は機能検出をお勧めしますが、Chrome(および一般的にはWebKit / Blink)も機能検出メカニズムに嘘をついていることで有名です。

既知のUA文字列をサードパーティのサイトを介して他のブラウザの文字列と比較し、そこからパターンを作成することによってのみ、最新の状態を維持することをお勧めします。これをどのように行うかは、文字列自体に完全に依存します。ブラウザとUA文字列の性質上、それらを照合するための「信頼できる」正規表現はあり得ないことを覚えておいてください。

PHPでは、関連するサーバー変数は$_SERVER['HTTP_USER_AGENT']です。

于 2010-06-15T18:23:58.200 に答える
9

@Adams の回答に基づいて、 useragentstring.com および udger.com を使用して、ユーザー エージェント文字列に「Chrome」を含む一部のブラウザーを除外することにより、Google Chrome をより正確に 検出ます

if(preg_match('/(Chrome|CriOS)\//i',$_SERVER['HTTP_USER_AGENT'])
 && !preg_match('/(Aviator|ChromePlus|coc_|Dragon|Edge|Flock|Iron|Kinza|Maxthon|MxNitro|Nichrome|OPR|Perk|Rockmelt|Seznam|Sleipnir|Spark|UBrowser|Vivaldi|WebExplorer|YaBrowser)/i',$_SERVER['HTTP_USER_AGENT'])){
    // Browser might be Google Chrome
}
于 2015-11-15T12:37:36.690 に答える
1

実際にブラウザを検出する方法があります。しかし、回答の 1 つが述べているように、ブラウザ、インデックス作成ボットは、実際の名前を広く模倣しているため、手動機能が成功すると、いつでもうまく機能しなくなる可能性があります。

私の回答の日までにクロスブラウザーの互換性で CSS メディアルールが十分に実装されていない特定のブラウザーで何かを印刷している場合、ブラウザーの検出が必要になることがあります。

単純で信頼できない方法

UA文字列で特定のブラウザを取得するには、そのような関数を使用できます(ここからの変更されたフォーク):

function get_browser_manually() {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $browser = "n/a";
    $browsers = array(
        '/msie/i' => 'Internet explorer',
        '/IE/i' => 'Internet explorer',
        '/Edg/i' => 'Edge',
        '/gecko/i' => 'Firefox',
        '/fox/i' => 'Firefox',
        '/safari/i' => 'Safari',
        '/opera/i' => 'Opera',
        '/mobile/i' => 'Mobile browser',
        '/phone/i' => 'Mobile browser',
        '/Yowser/i' => 'Yandex Browser',
        '/Ya/i' => 'Yandex Browser',
        '/Presto/i' => 'Opera',
        '/Chrome/i' => 'Chrome'
    );

    foreach ($browsers as $regex => $value) {
    if (preg_match($regex, $user_agent)) { 
        $browser = $value; 
        return $browser;
    }
    }
}

echo "Browser: " . get_browser_manually();

組み込み & 信頼性の高い方法

PHP には、ブラウザとプラットフォームを取得するためのget_browser()関数が組み込まれています。PHP7 より前は遅かったのですが、今ではかなり速くなったと報告されています。

これを機能させるには、 browscap.orgから追加のファイル (検出精度のニーズに応じて小、中、大) をダウンロードし、ファイルを PHP ディレクトリにコピーしてphp.iniに含める必要があります。

[browscap]
; http://php.net/browscap
browscap = C:\PHP\extras\lite_php_browscap.ini

PHP スクリプトでは、get_browser() を呼び出して出力を使用できます。

$browser = get_browser(null, true);
echo '<pre>';
echo print_r($browser,1);
echo '</pre>';

Chrome の出力は次のようになります。

Array
(
    [browser_name_regex] => ~^mozilla/5\.0 \(.*windows nt 10\.0.*\) applewebkit ... ...
    [browser_name_pattern] => Mozilla/5.0 (*Windows NT 10.0*) applewebkit... ...
    [parent] => Chrome 89.0
    [platform] => Win10
    [comment] => Chrome 89.0
    [browser] => Chrome
    [version] => 89.0
    [device_type] => Desktop
    [ismobiledevice] => 
    [istablet] => 
)

他のブラウザーをテストする必要がある場合は、Chrome 用の軽量のUseragent スイッチャー拡張機能を検討してください。

注: browsecap ファイルはデフォルト設定ではなく、デフォルトで無効になっています。get_browser()を呼び出すことができるかどうかを確認して、安全に呼び出すようにしてください。

if (!ini_get('browscap')) {

    // Not set, use other custom func to detect browser:
    $browser = get_browser_manually();
} else {

    // Browsecap.ini was set, use it:
    $browser = get_browser(null, true);
}
于 2021-09-05T16:31:27.720 に答える