【问题标题】:Regular expression to detect Internet Explorer 11检测 Internet Explorer 11 的正则表达式
【发布时间】:2016-05-08 07:59:08
【问题描述】:

我正在使用这个preg_match 字符串

preg_match('/Trident/7.0; rv:11.0/',$_SERVER["HTTP_USER_AGENT"]

检测 IE11,以便我可以为其启用平板电脑模式。但是它返回“未知分隔符 7”。

如果 PHP 不抱怨我,我该如何做到这一点?

【问题讨论】:

  • 这只是告诉你它是 IE11,而不是平板电脑,甚至是触控设备。奇怪的是,访问该页面的 IE11 桌面用户比平板电脑用户多得多。为没有触摸屏的桌面用户启用平板电脑模式会产生什么后果?
  • 很惊讶没有人能打败我,但请不要浏览器检测。这是一个非常坏的习惯。相反,我建议您尝试响应式设计技术和功能检测来构建您的应用程序。 FWIW 我曾经在移动和桌面专用网站的阵营中工作。但这很快就变成了大规模的维护等等。首先启动移动设备,然后横向扩展。这比您想象的要容易。
  • @ChrisLove,不,因为 google 使用浏览器检测,msn 和 microsoft.com 也是如此。那我为什么不呢?
  • 如果 Google 跳下金门,你应该这样做吗?你必须意识到像微软和谷歌这样的大型组织并没有完全遵循最佳实践。我使用浏览器检测来确定访问者是否使用过时的浏览器。如果是这样,我会为他们提供一个没有 JavaScript 的核心站点。但是,即使这些天,当前的浏览器也很漂亮。根据我近 4 年来尝试解决移动客户端设计的经验,仍然推荐一种响应式、移动优先的方法作为完整的解决方案。

标签: php preg-match internet-explorer-11


【解决方案1】:

这真的是一个正则表达式还是一个文字字符串?如果只是字符串,可以使用strpos函数代替。

if (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false) {
    // your code
}

如果是正则表达式,必须转义/.等特殊字符

编辑:

您可以在此答案的 cmets 中看到代码在所有情况下都无法正确检测到 IE 11。我实际上并没有对其进行测试以匹配它,我只是将问题创建者的代码调整为使用strpos 而不是preg_match,因为它应用不正确。

如果您想要一种可靠的方法来检测 IE 11,请查看其他答案。

【讨论】:

  • 与我的 IE 字符串不匹配:Windows NT 6.3;哇64;三叉戟/7.0; ASU2JS;房车:11.0
  • 这里是访问日志。以上不起作用。这取自 ie 11 请求。 172.16.0.85 - - [30/Jan/2015:16:15:01 +0000] "GET /wp-content/plugins/contact-form-7/includes/css/styles.css?ver=4.1 HTTP/1.1" 200 1103 "http://website-dev.uk.aaa.com/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)" 0/3500
【解决方案2】:

用户代理字符串在不同平台或设备上的报告可能不同。看看这个:http://msdn.microsoft.com/en-au/library/ie/hh869301(v=vs.85).aspx

刚刚发现以下字符串模式涵盖了 IE11 或更高版本报告的大多数用户代理(如果 Microsoft 再次为更新版本的 IE 更改其用户代理字符串,则可能不成立):

if (preg_match("/(Trident\/(\d{2,}|7|8|9)(.*)rv:(\d{2,}))|(MSIE\ (\d{2,}|8|9)(.*)Tablet\ PC)|(Trident\/(\d{2,}|7|8|9))/", $_SERVER["HTTP_USER_AGENT"], $match) != 0) {
    print 'You are using IE11 or above.';
}

【讨论】:

    【解决方案3】:

    我觉得应该是的

    if (preg_match("/Trident\/7.0;(.*)rv:11.0/", $_SERVER["HTTP_USER_AGENT"], $match) != 0) {}
    

    因为有时你会看到这样的用户代理

    Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; ASU2JS; rv:11.0) 像壁虎

    【讨论】:

      【解决方案4】:

      IE11 有触控版本和非触控版本,这意味着 Guilherme Sehn 的回答不适用于触控设备。

      if(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false)
      

      改用这个:

      if ( strpos($_SERVER['HTTP_USER_AGENT'], 'rv:11.0')     !== false
        && strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0;')!== false)
      {
          echo "User is on IE11 touch / non-touch";
      }
      

      这是因为可以在“Trident”和修订号之间添加任意数量的参数。

      同样,如果您想检查他们是否处于触摸状态,只需为“Touch;”执行一个 strpos。

      【讨论】:

        【解决方案5】:

        使用不在正则表达式字符串中的另一个字符总是好的,这样您就不必转义字符串并且更容易阅读长字符串。所以你可以使用~作为分隔符:

        preg_match('~Trident/7.0; rv:11.0~',$_SERVER["HTTP_USER_AGENT"])
        

        另一种思路是使用stristr函数查看一个字符串是否出现在另一个字符串中

        stristr($_SERVER['HTTP_USER_AGENT'],'Trident/7.0; rv:11.0')
        

        【讨论】:

          【解决方案6】:

          您需要转义中间的斜线 / 以使用由斜线括起来的正则表达式:

          preg_match( '/Trident\/7.0; rv:11.0/', $_SERVER['HTTP_USER_AGENT'] );
          

          您也可以使用preg_quote() 转义字符串中的所有特殊字符:

          $regexp = sprintf( '/%s/', preg_quote( 'Trident/7.0; rv:11.0', '/' ) );
          preg_match( $regexp, $_SERVER['HTTP_USER_AGENT'] );
          

          http://www.php.net/manual/en/function.preg-quote.php

          【讨论】:

          • 在整个正则表达式上使用preg_quote 的那一刻,您应该意识到您不需要正则表达式!
          【解决方案7】:

          Trident 之后的 / 被视为分隔符。你可以逃脱它:

          preg_match('/Trident\/7.0; rv:11.0/',$_SERVER["HTTP_USER_AGENT"]
          

          不过,最好不要使用preg_match:你不需要它。您所做的只是寻找一个不变的子字符串,这可以通过strpos 来完成:

          if (false !== strpos($_SERVER["HTTP_USER_AGENT"], '/Trident/7.0; rv:11.0/')) {
          

          【讨论】:

            【解决方案8】:

            我会使用browscap project 自己获取这些数据。它更快更可靠

            【讨论】:

              猜你喜欢
              • 2019-11-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-29
              相关资源
              最近更新 更多