10

我正在使用这个preg_match字符串

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

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

如果 PHP 不抱怨我,我怎么能做到这一点?

4

8 回答 8

14

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

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

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

编辑:

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

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

于 2013-11-02T14:36:19.380 回答
10

用户代理字符串可能会在不同的平台或设备上以不同的方式报告。看看这个: 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.';
}
于 2014-08-27T04:17:15.437 回答
6

我认为应该是

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) 像 Gecko

于 2014-04-04T06:22:11.153 回答
2

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。

于 2014-07-23T14:18:51.477 回答
1

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

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

另一个想法是使用stristr函数来查看一个字符串是否出现在另一个字符串中

stristr($_SERVER['HTTP_USER_AGENT'],'Trident/7.0; rv:11.0')
于 2014-01-13T13:38:12.137 回答
0

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

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

于 2013-11-02T14:35:56.940 回答
0

/after被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/')) {
于 2013-11-02T14:35:58.150 回答
0

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

于 2013-11-02T14:56:29.037 回答