用于检测 Internet Explorer 的正则表达式 11


Regular expression to detect Internet Explorer 11

我正在使用这个preg_match字符串

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

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

我怎样才能做到这一点而不让 PHP 抱怨我?

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

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

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

编辑:

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

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

用户代理字符串在不同平台或设备中的报告方式可能不同。看看这个: 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.';
}

我认为应该是

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

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

Mozilla/5.0 (Windows NT 6.3;哇64;三叉戟/7.0;ASU2JS;rv:11.0) 像壁虎

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";
}

这是因为可以在"三叉戟"和修订号之间添加任意数量的参数。

同样,如果您想检查它们是否处于联系状态,只需为"触摸;"执行 strpos。

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

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

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

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

转义中间斜杠/才能在由 slahses 括起来的正则表达式中工作:

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

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/')) {

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