我正在使用这个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
}
如果是正则表达式,则必须转义特殊字符,例如/
and.
编辑:
您可以在此答案的评论中看到代码在所有情况下都无法正确检测到 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; WOW64; Trident/7.0; ASU2JS; rv:11.0) 像 Gecko
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。
使用不在正则表达式字符串中的另一个字符总是好的,这样您就不必转义字符串并且更容易阅读长字符串。所以你可以使用~
分隔符:
preg_match('~Trident/7.0; rv:11.0~',$_SERVER["HTTP_USER_AGENT"])
另一个想法是使用stristr函数来查看一个字符串是否出现在另一个字符串中
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'] );
/
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/')) {
我会使用browscap 项目自己获取这些数据。它更快更可靠