PHP - 从User-Agent

时间:2017-12-28 15:19:07

标签: php ios regex user-agent

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

提前致谢。

4 个答案:

答案 0 :(得分: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_]+)

用法

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

用法 - 使用OP代码

<?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匹配ao后跟dipadipod
  • 匹配文字空格字符
  • os按字面意思匹配
  • 匹配文字空格字符。我注意到OP也有OS\_,这让我觉得这里可能有一个下划线字符。如果是这种情况this can be changed to [ _] instead
  • \K重置比赛的起点。任何以前消费的字符都将从最终匹配中排除
  • [\d_]+匹配任何数字或下划线字符中的一个或多个

答案 1 :(得分:1)

这应该做的工作:

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

答案 2 :(得分:0)

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

$result = parse_user_agent($ua);

然后您可以从该对象中提取version

此javascript的user-agent-parser也可以使用。

答案 3 :(得分:0)

尝试使用此功能:library(shiny) u <- shinyUI(pageWithSidebar( headerPanel("Staz w bezrobociu"), sidebarPanel( selectInput("variable", "Variable:", list("Milles/gallon", "Horse power") ), textInput("nc","Number of cylinders",value = 6) ), mainPanel( plotOutput("Plot") ) )) s <- shinyServer(function(input, output) { dataX <- reactive({mtcars[mtcars$cyl==input$nc,,drop = FALSE]}) datasetInput <- reactive({ switch(input$variable, "Milles/gallon" = mpg, "Horse power" = hp) }) output$Plot <- renderPlot({ hist(dataX()$datasetInput()) }) }) shinyApp(u,s)