我正在使用这个preg_match
字符串
preg_match('/Trident/7.0; rv:11.0/',$_SERVER["HTTP_USER_AGENT"]
我希望能够检测到IE11,以便为其启用平板模式。但是它返回“未知分隔符7”。
我应该如何在不引起PHP报错的情况下实现这一点?
我正在使用这个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,请查看其他答案。
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
- shorif2000用户代理字符串可能在不同的平台或设备上报告不同。请看这个链接:http://msdn.microsoft.com/en-au/library/ie/hh869301(v=vs.85).aspx
我发现了一种包含大部分IE11或以上版本所报告的用户代理的字符串模式(如果微软为新版本的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) {}
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";
}
使用不在正则表达式字符串中的另一个字符是很好的选择,这样您就不必转义字符串,并且更容易阅读长字符串。因此,您可以使用〜
作为分隔符:
preg_match('~Trident/7.0; rv:11.0~',$_SERVER["HTTP_USER_AGENT"])
stristr($_SERVER['HTTP_USER_AGENT'],'Trident/7.0; rv:11.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'] );
preg_quote
的时候,就应该意识到你其实不需要正则表达式了! - lonesomedayTrident
后面的/
被视为分隔符。您可以对其进行转义:
preg_match('/Trident\/7.0; rv:11.0/',$_SERVER["HTTP_USER_AGENT"]
strpos
来完成:if (false !== strpos($_SERVER["HTTP_USER_AGENT"], '/Trident/7.0; rv:11.0/')) {