【问题标题】:How to detect "Google Chrome" as the user-agent using PHP?如何使用 PHP 检测“Google Chrome”作为用户代理?
【发布时间】:2011-03-04 03:17:47
【问题描述】:

我很想知道用户代理在服务器端是否是使用 PHP 的“Chrome”。是否有可靠的正则表达式用于从请求标头中解析出用户代理字符串?

【问题讨论】:

    标签: php regex google-chrome user-agent browser-detection


    【解决方案1】:

    在这一点上,太多的浏览器冒充 Chrome 以利用其受欢迎程度以及打击滥用浏览器检测以使“Chrome”的简单匹配不再有效。我会建议继续进行特征检测,但 Chrome(以及一般的 WebKit/Blink)也因对特征检测机制撒谎而臭名昭著,因此即使这样也没有人们所说的那么好。

    我只能建议通过第三方网站将其已知的 UA 字符串与其他浏览器的字符串进行比较,并从中创建模式,从而掌握最新情况。你如何做到这一点完全取决于字符串本身。请记住,由于浏览器和 UA 字符串的性质,永远不可能有一个“可靠的”正则表达式来匹配它们。

    在 PHP 中,相关的服务器变量是$_SERVER['HTTP_USER_AGENT']

    【讨论】:

    • 不错的一个。使用 preg_match 来检测 Chrome 肯定是开销。
    • 为什么需要!== falseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) 不会更容易吗?
    • @Tuga:如果字符串以'Chrome' 开头,strpos() 返回 0。由于0 == false,if 代码不会运行,但您希望它运行。如果未找到该字符串,该函数将返回实际的false,因此您必须使用!== false 按类型进行比较。这也是为什么你的答案是错误的。
    • 我不同意:这个 if 子句将在以下浏览器的版本上评估为 true:Chrome、Maxthon、Flock、IE 10.0、IE 9.0、IE 8.0、Iron、RockMelt。更多信息:useragentstring.com/pages/Browserlist !!!
    • @NaNsTtiX 你说得对。但是:1)Maxthon、Flock、Iron和RockMelt都是基于Chrome的(所以它们基本上都是Chrome); 2) IE 仅在安装了Chrome Frame 的情况下在其用户代理中具有“chrome”(因此 IE 以某种方式成为 Chrome)。如果有人需要单独检测 IE,他们可以添加stripos($_SERVER['HTTP_USER_AGENT'], 'chromeframe') === false 条件。
    【解决方案2】:

    值得一提的是,如果您还想包含适用于 iOS 的 Chrome,您还需要匹配“CriOS”:

    if (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== false
     || strpos($_SERVER['HTTP_USER_AGENT'], 'CriOS') !== false) {
        // User agent is Google Chrome
    }
    

    【讨论】:

    • 嘿亚当我有一个问题要问你,因为我应该把我的代码放在第二行?它在我的代码中的作用是什么?因为当我从我的代码中删除这一行并尝试运行它时,它不起作用
    【解决方案3】:

    在@Adams 答案的基础上,通过排除用户代理字符串中带有“Chrome”的某些浏览器,更准确地检测 Google Chrome useragentstring.comudger.com

    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
    }
    

    【讨论】:

      【解决方案4】:

      实际上有一些方法可以检测浏览器。但是,正如其中一个答案所述,浏览器、索引机器人广泛模仿其真实姓名,因此,一旦成功,手动功能可能随时停止正常工作。

      如果您使用特定浏览器打印某些内容,而在我的回答之日,CSS 媒体规则在跨浏览器兼容性方面实施不佳,则有时需要进行浏览器检测。

      简单不可靠的方法

      只是为了通过 UA 字符串获取特定的浏览器,你可以使用这样的函数(来自here 的修改分支):

      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 switcher extension

      注意: 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        • 2017-01-26
        相关资源
        最近更新 更多