我想从User-Agent获得PHP的确切iOS版本。我很清楚伪造用户代理的可能性,但在我的情况下,这不是问题。
普通的iPhone User-Agent字符串如下所示:
Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0 Mobile/15C153 Safari/604.1
如何从中提取操作系统版本?在这种情况下,它是“11_2_1”。我必须能够从iPhone,iPad和iPod用户代理中取出它。它也可以是X_X而不是X_X_X。
到目前为止我得到了这个:
<?php
$version = preg_match('(iPad|iPhone|iphone|iPod).*?(OS |os |OS\_)(\d+
((_|\.)\d)?((_|\.)\d)?)', $_SERVER['HTTP_USER_AGENT']);
echo $version;
?>
但是,从iPhone访问它会显示一个空白页面。有谁可以帮助我吗?
提前致谢。
您可以执行多个正则表达式来获取操作系统版本。下面的正则表达式可能是最快的:
ip(?:hone|[ao]d) os \K[\d_]+
注意:这些正则表达式都使用i
标志。
也可以使用其他变体,例如:
i(?:phone|pad|pod) os \K[\d_]+
i(?:phone|pad|pod) os ([\d_]+)
<?php
$re = '/ip(?:hone|[ao]d) os \K[\d_]+/i';
$str = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0 Mobile/15C153 Safari/604.1';
preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);
var_dump($matches);
注意:要在结果中分隔每个版本部分,可以使用以下行as shown here:
var_dump(explode("_", $matches[0][0]));
<?php
$re = '/ip(?:hone|[ao]d) os \K[\d_]+/i';
preg_match($re, $_SERVER['HTTP_USER_AGENT'], $matches, PREG_OFFSET_CAPTURE, 0);
var_dump($matches);
Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0 Mobile/15C153 Safari/604.1
输出匹配:
11_2_1
在explode()
上输出与_
的匹配(见第一个用法部分下的注释):
11
2
1
ip
按字面意思对比(?:hone|[ao]d)
匹配以下任一项
hone
字面匹配(使iphone
)
[ao]d
匹配a
或o
,然后是d
(使ipad
或ipod
)
匹配文字空间角色os
按字面意思对比
匹配文字空间角色。我注意到OP也有OS\_
,这让我觉得这里可能有一个下划线字符。如果是这样的话this can be changed to [ _]
instead。\K
重置比赛的起点。从最终匹配中排除任何以前消耗的字符[\d_]+
匹配任何数字或下划线字符中的一个或多个这应该做的工作:
$version = preg_match("/OS ((\d+_?){2,3})/i", $_SERVER['HTTP_USER_AGENT'], $matches);
print_r(str_replace("_",".",$matches[1]));
您可以使用User-Agent解析器,甚至可以创建自己的解析器。 Here你有一个例子,我发现这个php项目PhpUserAgent,它应该非常简单易用:
$result = parse_user_agent($ua);
然后你可以从那个对象中提取version
。
这个用于javascript的user-agent-parser
也非常有效。
试着用这个:"/(i(?:phone|pad|pod)) OS (\d+_\d+_\d+)/i"
。