我想从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访问它会显示一个空白页面。有人能帮帮我吗?
提前致谢。
答案 0 :(得分:2)
您可以执行多个正则表达式来获取操作系统版本。下面的正则表达式可能是最快的:
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_]+
匹配任何数字或下划线字符中的一个或多个答案 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)
。