我正在使用这个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项目自己获取这些数据。它更快、更可靠