- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我编写了一个简单的类来检查用户代理是否会针对不兼容的浏览器显示警告。我正在做这个服务器端,我知道它可能是客户端。
好的,首先,我不太擅长编写正则表达式..
我写了一个正则表达式来搜索小写浏览器名称后跟版本号。我做了一个 foreach()
用数组像这样的东西:
<?php
$browsers = Array('msie','chrome','safari','firefox','opera');
foreach($browsers as $i => $browser)
{
$regex = "#({$browser})[/ ]([0-9.]*)#i";
if(preg_match($regex, $useragent, $matches))
{
echo "Browser: \"{$matches[0]}\", version: \"{$matches[1]}\"";
}
}
?>
这将产生:Browser: "Firefox", version "23.0.6"
.
我发现它适用于 Firefox、MS IE 和旧版本的 Opera。然而,某些浏览器(如 Safari 和较新版本的 Opera)具有不同的用户代理字符串,其中包含 Version/x.x.x,即
只是为了让您了解这里有 3 个用户代理字符串,我需要的已突出显示。
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/<strong><em>6.0.5</em></strong> <em><strong>Safari</strong></em>/536.30.1
Mozilla/5.0 (compatible; <strong><em>MSIE 10.0</em></strong>; Windows NT 6.1; WOW64; Trident/6.0)
<strong><em>Opera</em></strong>/9.80 (Windows NT 6.0) Presto/2.12.388 Version/<strong><em>12.14</em></strong>
因此在以下每一个中,以下人类逻辑都是正确的:
Version/<strong><em>x.x.x</em></strong>
在版本号的字符串中。 Browsername/<strong><em>x.x.x</em></strong>
是版本号。此外,如果您查看上面的第一个也是最后一个用户代理字符串,您可以看到 Version
可以出现在浏览器名称之后的 或 之前。
有人可以帮我制作一个与preg_match()
一起使用的正则表达式吗? ?我需要使用条件语句还是可以搜索可选分组?我有点困惑..
谢谢!
编辑 17-09-2013: 我忘了说,我不想使用 get_browser()
,它使用一个巨大的库来检测浏览器的功能等。我只需要一个简短的浏览器“白名单”,它应该花费几毫秒而不是几百毫秒来读取浏览器 cap.ini 文件。否则乔治的回答本来就是的答案..
最佳答案
由于 Remus 的回答我在某些浏览器上遇到了一些问题,所以最终做了一些不同的事情。
<?php
function get_useragent_info($ua)
{
$ua = is_null($ua) ? $_SERVER['HTTP_USER_AGENT'] : $ua;
// Enumerate all common platforms, this is usually placed in braces (order is important! First come first serve..)
$platforms = "Windows|iPad|iPhone|Macintosh|Android|BlackBerry";
// All browsers except MSIE/Trident and..
// NOT for browsers that use this syntax: Version/0.xx Browsername
$browsers = "Firefox|Chrome";
// Specifically for browsers that use this syntax: Version/0.xx Browername
$browsers_v = "Safari|Mobile"; // Mobile is mentioned in Android and BlackBerry UA's
// Fill in your most common engines..
$engines = "Gecko|Trident|Webkit|Presto";
// Regex the crap out of the user agent, making multiple selections and..
$regex_pat = "/((Mozilla)\/[\d\.]+|(Opera)\/[\d\.]+)\s\(.*?((MSIE)\s([\d\.]+).*?(Windows)|({$platforms})).*?\s.*?({$engines})[\/\s]+[\d\.]+(\;\srv\:([\d\.]+)|.*?).*?(Version[\/\s]([\d\.]+)(.*?({$browsers_v})|$)|(({$browsers})[\/\s]+([\d\.]+))|$).*/i";
// .. placing them in this order, delimited by |
$replace_pat = '$7$8|$2$3|$9|${17}${15}$5$3|${18}${13}$6${11}';
// Run the preg_replace .. and explode on |
$ua_array = explode("|",preg_replace($regex_pat, $replace_pat, $ua, PREG_PATTERN_ORDER));
if (count($ua_array)>1)
{
$return['platform'] = $ua_array[0]; // Windows / iPad / MacOS / BlackBerry
$return['type'] = $ua_array[1]; // Mozilla / Opera etc.
$return['renderer'] = $ua_array[2]; // WebKit / Presto / Trident / Gecko etc.
$return['browser'] = $ua_array[3]; // Chrome / Safari / MSIE / Firefox
/*
Not necessary but this will filter out Chromes ridiculously long version
numbers 31.0.1234.122 becomes 31.0, while a "normal" 3 digit version number
like 10.2.1 would stay 10.2.1, 11.0 stays 11.0. Non-match stays what it is.
*/
if (preg_match("/^[\d]+\.[\d]+(?:\.[\d]{0,2}$)?/",$ua_array[4],$matches))
{
$return['version'] = $matches[0];
}
else
{
$return['version'] = $ua_array[4];
}
}
else
{
/*
Unknown browser..
This could be a deal breaker for you but I use this to actually keep old
browsers out of my application, users are told to download a compatible
browser (99% of modern browsers are compatible. You can also ignore my error
but then there is no guarantee that the application will work and thus
no need to report debugging data.
*/
return false;
}
// Replace some browsernames e.g. MSIE -> Internet Explorer
switch(strtolower($return['browser']))
{
case "msie":
case "trident":
$return['browser'] = "Internet Explorer";
break;
case "": // IE 11 is a steamy turd (thanks Microsoft...)
if (strtolower($return['renderer']) == "trident")
{
$return['browser'] = "Internet Explorer";
}
break;
}
switch(strtolower($return['platform']))
{
case "android": // These browsers claim to be Safari but are BB Mobile
case "blackberry": // and Android Mobile
if ($return['browser'] =="Safari" || $return['browser'] == "Mobile" || $return['browser'] == "")
{
$return['browser'] = "{$return['platform']} mobile";
}
break;
}
return $return;
} // End of Function
?>
关于PHP:浏览器版本号 user-agent with Version/x.x.x (Safari & Opera),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18818362/
我正在Mac上开发一个safari插件。现在我想知道safari3,safari4的所有版本号,因为我可以在一些插件示例代码info.plist中看到:MinBundleVersion是5530,我检
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在阅读 http://www.tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html我有一些问题。 版本号、次要版本号和发布号之间有什
是否必须所有用 C++ 创建的 dll 都有版本号?我的机器中有 dll,但是当我右键单击时,我无法看到版本号。 PS:我安装了Win 7。 最佳答案 重要的是要了解,在加载 DLL 期间不会使用版本
我知道 VS 2010 有 F# 2.0 和 VS 2012 - F# 3.0。 但是我如何获得 F# 版本号,例如在 F# 交互中?是否有一些命令,例如:#ver;; ? 谢谢。 最佳答案 当您在
我已经发布了如何在 Eclipse Gallileo 中找到它,但如果有人有有关旧版本的信息,请随时在下面发布。 最佳答案 (2012 年 9 月更新): MRT指出in the comments “
Rational Function Tester 脚本如何确定它在哪个版本的 RFT 下执行/构建? 我仔细研究了文档,发现最接近的是 com.rational.test.ft.script.Scri
我正在使用 Alfresco。我知道如何查看已安装的 Alfresco vesrion 编号,但我需要以编程方式获取此版本号,例如通过 rest API 或某些 http 请求。有可能吗? 最佳答案
我目前正在尝试更新版本号。在 TeamCity 中使用 Nant 构建文件,包含版本号。如果我只是使用 . . 在脚本中,buildNumber 已更新为 2.16.3,但我还希望有此版本号的计数
我想编写一个脚本,它可以递归地扫描目录中的 DLL 并生成所有版本号的报告。 如何使用脚本检测 DLL 的版本号? VBScript 解决方案是首选,除非有更好的方法。 最佳答案 您可以使用 File
我正在开始一个有人在两年前开始的项目,但我无法确定它运行的 django 版本。制作该项目的人不知道,而且我不确定猜测和检查是否有效,因为我实际上不知道该项目是否可以编译。我找到了this答案,但它表
我需要确保可用的 PostgreSQL 版本不低于要求的版本。可以按如下方式请求版本字符串: SELECT VERSION(); 它返回给我类似的东西: PostgreSQL 9.5.4, compi
在我的数据库中,我在列中填写了这些数据: 1 1.1 1.1.1 1.1.1.1 1.1.2 1.10 1.11 1.2 1.9 我想对其进行排序,得到的结果如下所示: 1 1.1 1.1.1 1.1
我正在编写一个脚本,它需要一个简单的短格式的 Bash 版本号。 我知道 bash --version,但这会产生很长的输出: GNU bash, version 4.2.10(1)-release
我将 Grunt 与 php 一起使用,并使用一个包来对我的 css 进行版本控制,并将日期戳记为 style.min.20160913230349.css。 但是我如何找到一个包,将新字符串更新到我
我有一个用 distutils 构建的 python 包,我在我的设置函数中使用版本参数,就像这样(除了名称和版本之外还有其他参数): setup(name='example_module', ver
Windows EXE 文件附有版本号,由以点分隔的四位数字组成(例如 1.0.0.0)。 问题:比较这些数字的正确方法是什么?具体来说,是 1.15.0.0 > 1.2.0.0(因为 15 > 2)
如果我有一个像 这样的 iOS 用户代理 Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532
我正在写一个 Symfony Console PHP应用程序takes a version number in the constructor . $app = new Application('my
我可以使用它们的一些构建语法或 Gradle API 中的某些内容来检查 Gradle 版本号吗? 最佳答案 gradle.gradleVersion 将返回版本号,作为字符串。 关于java - 如
我是一名优秀的程序员,十分优秀!