Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中检测Android浏览器(从v.1到2.3固件)_Php_Regex_Preg Match_Browser Detection - Fatal编程技术网

在PHP中检测Android浏览器(从v.1到2.3固件)

在PHP中检测Android浏览器(从v.1到2.3固件),php,regex,preg-match,browser-detection,Php,Regex,Preg Match,Browser Detection,我需要检测浏览器是否为Android(仅从1版到2.3版),这是否可行 if(preg_match('/Android [1-2.3]/', $_SERVER['HTTP_USER_AGENT'])) { echo 'something'; } 我真的不知道这些设备的用户代理是什么样子的,但您拥有的模式不太可能是您想要的。我想你还需要更多的东西: '/Android (1\.\d|2\.[012])/' 有很多不同的方法可以编写模式,但本质上这一种方法说,Android后面需要紧跟1.{a

我需要检测浏览器是否为Android(仅从1版到2.3版),这是否可行

if(preg_match('/Android [1-2.3]/', $_SERVER['HTTP_USER_AGENT'])) {
 echo 'something';
}

我真的不知道这些设备的用户代理是什么样子的,但您拥有的模式不太可能是您想要的。我想你还需要更多的东西:

'/Android (1\.\d|2\.[012])/'

有很多不同的方法可以编写模式,但本质上这一种方法说,
Android
后面需要紧跟
1.{anynumber}
2.0、2.1或2.2

下面的Regex可以精确匹配
Android[1-2.3]

Android([1](?:\[0-9])?|[2](?:\[0-3])?$)

对于
MSIE[6-8]Android[1-2.3]

MSIE[6-8]Android([1](?:\[0-9])?\[2](?:\[0-3])$


我建议您使用Browscap进行浏览器检测

获取浏览器
功能文档

“实际”browscap.ini文件下载

应注意的是,该项目目前已结束,正在对浏览器数据库进行进一步更新

在您的案例中的用法示例:

$browser = get_browser(null, true);
if (array_key_exists('Platform', $browser) && array_key_exists('Platform_Version', $browser) && $browser['Platform'] == 'Android' && $browser['Platform_Version'] <= 2.3) {
    echo 'Android <2.3 version';
}
$browser=get\u browser(null,true);

如果(array_key_存在('Platform',$browser)&&array_key_存在('Platform_Version',$browser)&&$browser['Platform']=='Android'&&browser['Platform_Version']您可以使用以下正则表达式获取Android浏览器版本,无论是x.x.x格式还是x.x格式。我有一个正则表达式来确定设备是否使用我支持的其中一个版本(2.3.x+):


在github中,我发现这段代码非常有用:

if(是旧的安卓系统('2.3')){
echo“此设备具有Android 2.3或更低版本”;
}
函数是旧的安卓($version='4.0.0'){
if(strstr($_SERVER['HTTP\u USER\u AGENT','Android')){
preg\u match('/Android(\d+(?:\.\d+++)[;)]/',$\u服务器['HTTP\u用户代理],$matches);
//$matches[0]=Android 4.1.2;
//$matches[1]=4.1.2

返回版本\u比较($matches[1],$version,'不。正则表达式引擎不知道版本号的范围是如何工作的,不是吗?你也在误用字符类,即使它只是你试图匹配的一个数字范围。这将匹配
Android 1
Android 2
Android。
Android 3
。事实上,如果其中任何一个匹配,它都会匹配是输入的子字符串(因此它也将匹配
Android2.5
)。您能告诉我们输入中可能显示的实际版本号吗?好的,我需要对不支持SVG的Android版本(因此所有版本都<2.3)进行回退。这在这里没有真正的帮助。一个“坏”列表版本号也将匹配
Android 2.4
这个呢?/Android[12]\.\d/@multiformingegno也将匹配任何版本
2.*
谢谢!:)最后一个问题,我如何将这个正则表达式与/MSIE[6-8]/?它应该类似于if(preg\u match('/MSIE[6-8];Android[1](?:\[0-9]);Android[2](?:\[0-3])“?$/”,$服务器['HTTP\U用户\U代理]))正确:)@multiformingegno这将像
MSIE[6-8](Android[1](?:\[0-9])?;Android[2](?:\[0-3])?$)
调整中间的空格。
/Android ([2].?[3-9].?[0-9]?|[3].?[0-9].?[0-9]?|[4].?[0-9].?[0-9]?)/
if(is_old_android('2.3')) {
  echo 'This device has Android 2.3 or lower';
}

function is_old_android($version = '4.0.0'){
   if(strstr($_SERVER['HTTP_USER_AGENT'], 'Android')){

     preg_match('/Android (\d+(?:\.\d+)+)[;)]/', $_SERVER['HTTP_USER_AGENT'], $matches);

     // $matches[0]= Android 4.1.2;
     // $matches[1]= 4.1.2

        return version_compare($matches[1], $version, '<=');
    }
}