PHP-从用户代理获取精确的iOS版本

PHP-从用户代理获取精确的iOS版本,php,ios,regex,user-agent,Php,Ios,Regex,User Agent,我想从用户代理那里得到PHP的iOS版本。我很清楚假冒用户代理的可能性,但就我而言,这不是一个问题 普通iPhone用户代理字符串如下所示: 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

我想从用户代理那里得到PHP的iOS版本。我很清楚假冒用户代理的可能性,但就我而言,这不是一个问题

普通iPhone用户代理字符串如下所示:

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访问它会显示一个空白页面。有人能帮我吗


提前感谢。

这应该可以完成以下工作:

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

这应该可以做到:

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

您可以使用用户代理解析器,甚至可以创建自己的解析器。您有一个例子,我还发现了这个php项目,它应该非常易于使用:

$result = parse_user_agent($ua);
然后可以从该对象提取版本


这对于javascript也非常有效。

您可以使用用户代理解析器,甚至可以创建自己的解析器。您有一个例子,我还发现了这个php项目,它应该非常易于使用:

$result = parse_user_agent($ua);
然后可以从该对象提取版本

这对javascript也很有效。

尝试使用这个:/i?:phone | pad | pod OS\d+d+d+d+/i。

尝试使用这个:/i?:phone | pad | pod OS\d+d+d+/i。

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

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

也可使用其他变化,例如:

i(?:phone|pad|pod) os \K[\d_]+
i(?:phone|pad|pod) os ([\d_]+)
用法 用法-使用OP的代码 输出 输出匹配项:

11_2_1
在第一个用法部分的注释中,输出与on的匹配:

解释 从字面上看,ip与此匹配 ?:hone |[ao]d匹配以下任一项 hone Match这简直就是iphone [ao]d匹配a或o,然后再匹配d制作ipad或ipod 匹配文本空格字符 操作系统与此完全匹配 匹配文本空格字符。我注意到OP也有OS\\这让我觉得这里可能有下划线字符。如果是这样的话。 \K重置匹配的起点。任何以前使用的字符都将从最终匹配中排除 [\d\]+匹配任意数字或下划线字符中的一个或多个 密码 您可以执行多个正则表达式来获取操作系统版本。下面的正则表达式可能是最快的:

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

也可使用其他变化,例如:

i(?:phone|pad|pod) os \K[\d_]+
i(?:phone|pad|pod) os ([\d_]+)
用法 用法-使用OP的代码 输出 输出匹配项:

11_2_1
在第一个用法部分的注释中,输出与on的匹配:

解释 从字面上看,ip与此匹配 ?:hone |[ao]d匹配以下任一项 hone Match这简直就是iphone [ao]d匹配a或o,然后再匹配d制作ipad或ipod 匹配文本空格字符 操作系统与此完全匹配 匹配文本空格字符。我注意到OP也有OS\\这让我觉得这里可能有下划线字符。如果是这样的话。 \K重置匹配的起点。任何以前使用的字符都将从最终匹配中排除 [\d\]+匹配任意数字或下划线字符中的一个或多个
i?:phone | pad | pod os[\d|]+或i?:phone | pad | pod os\K[\d|]+或ip?:hone |[ao]d os\K[\d|]+?注意:preg|u match在出错时返回false,这不会产生回声。您可能希望使用var_dump来代替。@AlexHowansky返回boolfalse@对不起,我有点迷路了。。不太有经验。@Johnny给我一点时间发布答案?:phone | pad | pod os[\d |]+或i?:phone | pad | pod os\K[\d |]+或ip?:hone |[ao]d os\K[\d |]+?注意preg|u match在出错时返回false,不会产生回声。您可能希望使用var_dump来代替。@AlexHowansky返回boolfalse@对不起,我有点迷路了。。不太有经验。@Johnny给我一点时间发布答案这只返回11,而目标浏览器是11_2_1。这只返回11,而目标浏览器是11_2_1。是的,忘了在末尾添加i以进行不区分大小写的匹配。谢谢。这不适用于Mozilla/5.0 iPad;CPU OS 5_1,如Mac OS X AppleWebKit/534.46…@TommasoBelluzzo此案例有点混乱,因为它的格式与给定的示例不同。在CPU之后,我假设存在类似iphone的字符串。这似乎是个骗局,埃尔鲁尔没有提到。它将与ctwheels给出的答案不匹配。是的,忘记在末尾添加i以进行不区分大小写的匹配。谢谢。这不适用于Mozilla/5.0 iPad;CPU OS 5_1,如Mac OS X AppleWebKit/534.46…@TommasoBelluzzo此案例有点混乱,因为它的格式与给定的示例不同。在CPU之后,我假设存在类似iphone的字符串。这似乎是个骗局,埃尔鲁尔没有提到。它与ctwheels给出的答案不匹配。感谢您的精彩解释-效果绝对不错@约翰尼,不客气!让我知道如果你需要任何澄清:感谢伟大的解释-工程绝对好@约翰尼,你是 我们非常欢迎!如果您需要任何澄清,请告诉我:
11_2_1
11
2
1