PHP - 从User-Agent获取确切的iOS版本

问题描述 投票:0回答:4

我想从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访问它会显示一个空白页面。有谁可以帮助我吗?

提前致谢。

php ios regex user-agent
4个回答
2
投票

您可以执行多个正则表达式来获取操作系统版本。下面的正则表达式可能是最快的:

See regex in use here

ip(?:hone|[ao]d) os \K[\d_]+

注意:这些正则表达式都使用i标志。

也可以使用其他变体,例如:

i(?:phone|pad|pod) os \K[\d_]+
i(?:phone|pad|pod) os ([\d_]+)

Usage

See code in use here

<?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]));

Usage - With OP's Code

<?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);

结果

Input

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

Output

输出匹配:

11_2_1

explode()上输出与_的匹配(见第一个用法部分下的注释):

11
2
1

说明

  • ip按字面意思对比
  • (?:hone|[ao]d)匹配以下任一项 hone字面匹配(使iphone[ao]d匹配ao,然后是d(使ipadipod
  • 匹配文字空间角色
  • os按字面意思对比
  • 匹配文字空间角色。我注意到OP也有OS\_,这让我觉得这里可能有一个下划线字符。如果是这样的话this can be changed to [ _] instead
  • \K重置比赛的起点。从最终匹配中排除任何以前消耗的字符
  • [\d_]+匹配任何数字或下划线字符中的一个或多个

1
投票

这应该做的工作:

$version = preg_match("/OS ((\d+_?){2,3})/i", $_SERVER['HTTP_USER_AGENT'], $matches);
print_r(str_replace("_",".",$matches[1]));

0
投票

您可以使用User-Agent解析器,甚至可以创建自己的解析器。 Here你有一个例子,我发现这个php项目PhpUserAgent,它应该非常简单易用:

$result = parse_user_agent($ua);

然后你可以从那个对象中提取version

这个用于javascript的user-agent-parser也非常有效。


0
投票

试着用这个:"/(i(?:phone|pad|pod)) OS (\d+_\d+_\d+)/i"

© www.soinside.com 2019 - 2024. All rights reserved.