用于操作系统检测的 PHP 正则表达式

2024-01-01

我使用此代码来检测用户的操作系统:

<?
$osList = array (
/* -- WINDOWS -- */
'Windows 10 (Windows NT 10.0)' => 'windows nt 10.0',
'Windows 8.1 (Windows NT 6.3)' => 'windows nt 6.3',
'Windows 8 (Windows NT 6.2)' => 'windows nt 6.2',
'Windows 7 (Windows NT 6.1)' => 'windows nt 6.1',
'Windows Vista (Windows NT 6.0)' => 'windows nt 6.0',
'Windows Server 2003 (Windows NT 5.2)' => 'windows nt 5.2',
'Windows XP (Windows NT 5.1)' => 'windows nt 5.1',
'Windows 2000 sp1 (Windows NT 5.01)' => 'windows nt 5.01',
'Windows 2000 (Windows NT 5.0)' => 'windows nt 5.0',
'Windows NT 4.0' => 'windows nt 4.0',
'Windows Me  (Windows 9x 4.9)' => 'win 9x 4.9',
'Windows 98' => 'windows 98',
'Windows 95' => 'windows 95',
'Windows CE' => 'windows ce',
'Windows (version unknown)' => 'windows',
/* -- MAC OS X -- */
'Mac OS X Beta (Kodiak)' => 'Mac OS X beta',
'Mac OS X Cheetah' => 'Mac OS X 10.0',
'Mac OS X Puma' => 'Mac OS X 10.1',
'Mac OS X Jaguar' => 'Mac OS X 10.2',
'Mac OS X Panther' => 'Mac OS X 10.3',
'Mac OS X Tiger' => 'Mac OS X 10.4',
'Mac OS X Leopard' => 'Mac OS X 10.5',
'Mac OS X Snow Leopard' => 'Mac OS X 10.6',
'Mac OS X Lion' => 'Mac OS X 10.7',
'Mac OS X Mountain Lion' => 'Mac OS X 10.8',
'Mac OS X Mavericks' => 'Mac OS X 10.9',
'Mac OS X Yosemite' => 'Mac OS X 10.10',
'Mac OS X El Capitan' => 'Mac OS X 10.11',
'macOS Sierra' => 'Mac OS X 10.12',
'Mac OS X (version unknown)' => 'Mac OS X',
'Mac OS (classic)' => '(mac_powerpc)|(macintosh)',
/* -- OTHERS -- */
'OpenBSD' => 'openbsd',
'SunOS' => 'sunos',
'Ubuntu' => 'ubuntu',
'Linux (or Linux based)' => '(linux)|(x11)',
'QNX' => 'QNX',
'BeOS' => 'beos',
'OS2' => 'os/2',
'SearchBot'=>'(nuhk)|(googlebot)|(yammybot)|(openbot)|(slurp)|(msnbot)|(ask jeeves/teoma)|(ia_archiver)'
);

$useragent = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
$useragent = strtolower($useragent);

foreach($osList as $os=>$match) {
    if (preg_match('/' . $match . '/i', $useragent)) {
        break;  
    } else {
        $os = "Unknown";    
    }
}
?>

这里的问题是:我正在使用OS X 埃尔卡皮坦(10.11.5) 这段代码显示我正在使用OS X 美洲狮(10.1) 因为'Mac OS X El Capitan' => 'Mac OS X 10.11'.

那么,我该如何告诉preg_match 检查是否$match是“X.Y(.Z)”?


您可以在之后添加一个字符类1对于 OS X Puma,仅当其后面的字符是时才匹配not一个数字,例如:

'Mac OS X Puma' => 'Mac OS X 10.1[^0-9]',

这对于可靠地检测版本 10.1 与当前和未来版本应该是安全的,例如Mac OS X 10.1999.42


应该注意的是,您当前匹配的用户代理字符串很可能在浏览器之间有所不同,甚至可以由用户在其浏览器内进行编辑。如果需要高度成功的匹配,则需要用户代理嗅探以外的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于操作系统检测的 PHP 正则表达式 的相关文章

随机推荐

  • UIView 中的黑色背景?

    我按照在线教程在子类 UIView 中进行绘制 本教程显示了一个具有白色背景的 UIView 我通过简单地更改超级的背景颜色来修复此问题 问题是 当触摸结束时 背景不会保持清晰 我不知道 我只是尝试将填充颜色设置为 uicolorclear
  • 链式哈希表与开放寻址哈希表

    有人可以解释这两种实现之间的主要区别 优点 缺点 吗 对于图书馆 建议采用什么实施方式 维基百科关于哈希表的文章 http en wikipedia org wiki Hash table对人们使用的不同哈希表方案提供了明显更好的解释和概述
  • 我可以将 Subversion 用于多 GB 数据集吗?

    该数据集包含 6766 个文件夹中的 97984 个文件 大小为 2 57 GB 其中很多是二进制文件 对我来说 这听起来并不那么重要 大约 50 个文件的每日数据更改率为数百 KB 但我担心颠覆会变得极其缓慢 无论如何 它从来都不是很快
  • 尝试在 Google App Engine 项目中创建备份时出现 404

    Setup 我按照以下步骤后遇到了404问题不被接受问题的答案App Engine 数据存储区 以编程方式备份 https stackoverflow com questions 15811982 appengine datastore b
  • 艰苦学习 Python 练习 48 帮助

    我正在学习 Python The Hard Way 并在练习 48 中遇到了挑战 您将获得大量代码作为单元测试 并要求我们创建一个函数以使单元测试通过 我不确定这段代码到底应该是什么样子 我已粘贴其中一个函数作为参考 它们看起来都与这个相似
  • 指定条形图中条形之间的空格

    我正在尝试用 R 生成一个条形图 条形的宽度不同 条形之间的间距也不同 例如我有一个矩阵 data lt matrix c 1 2 2 4 7 1 11 12 3 ncol 3 byrow T colnames data lt c Star
  • MongoDB (Java) - 如何运行保存在 javascript 文件中的查询?

    所以我有很多 js 文件 我之前用它们从命令行界面查询 MongoDB 但现在我希望能够通过 Java 运行这些相同的查询 我使用 Java 来支持依赖于查询中的信息 我如何使用来自 Java 驱动程序的 JavaScript 查询并返回一
  • Python下间歇性“sslv3警报握手失败”

    我有一个用 Java 编写的 REST API 在 JBoss 下运行 最近我们将 JVM 从 1 6 更新到了 1 7 这开始导致仅我们正在连接的 Python 客户端出现问题 Python 客户端间歇性地出现握手失败 我们编写了一个非常
  • 如何禁用 Maven Javadoc 插件中的 Javadoc 警告?

    我正在使用 Maven Javadoc 插件 它输出警告如下 ERROR home monperrus spoon src main java spoon visitor CtVisitor java 144 warning no para
  • python httplib2 证书验证失败

    我已经尝试了一切我能找到的方法来让它发挥作用 我正在为基于 python 的任务程序 称为 GTG 开发一个插件 我在 Opensuse Linux 上运行 Gnome 代码 Python 2 7 def initialize self I
  • 类型“文档”缺少类型中的以下属性

    所以我有一个 Node w Typescript REST API 我有一个注册方法 它创建一个用户并使用创建的用户的名字 姓氏 电子邮件进行响应 问题是我遇到此打字稿错误 显示 类型 文档 缺少类型 SavedUser 中的以下属性 名字
  • 使用 jaxb 解析包含 xi:includes 的 xml 时遇到问题

    我正在使用 JAXB 来解析 xml 我有一个如下的架构 以及在此架构上定义的两个 xml 文件 a xml 和 b xml a xml 通过 xi include xml 标签依赖于 b xml 请提交以下示例以获取更清晰的数据 I ha
  • 在 NSScrollView 中,垂直滑块始终指向视图的底部

    我正在开发 Mac 应用程序 在此应用程序中 我使用 NSScrollView 的实例作为滚动视图 我设置了一个 customView 它是此 ScrollView 中 NSView 的实例 如下所示 scrollView setDocum
  • Get-SPWeb 无法找到具有 ID 或 URL 的对象

    问题 我似乎无法弄清楚为什么会出现下面的错误 即使 SharePoint 网站以及被调用的文档库存在 文档库Lib1有文档 文件夹 文档库Lib2是空的 有人知道出了什么问题吗 ERROR Get SPWeb Cannot find an
  • 如何使用 VBScript 关闭特定文件夹?

    我正在尝试使用 VBScript 制作一个简单的程序 每次打开特定文件夹时都会关闭该文件夹 从而拒绝对该文件夹的访问 我已经成功地在许多文件夹中使用了此代码 但由于某种原因它不适用于C ProgramData Microsoft Windo
  • 尚未注册类型“Microsoft.AspNetCore.Hosting.IHostingEnvironment”的服务

    当我想开火时我遇到了问题add migrationASP MVC Core 2 项目的命令 尚未注册类型 Microsoft AspNetCore Hosting IHostingEnvironment 的服务 这是我的启动 cs publ
  • 如何用BeautifulSoup找到评论标签

    我尝试了 soup find 但它似乎不起作用 提前致谢 编辑 感谢您提供有关如何查找所有评论的提示 我有一个后续问题 具体如何搜索评论 例如 我有以下评论标签 我真的只想要这个东西 i Wednesday 110518 i 110518
  • 如何在 Laravel Auth::attempt 中使用条件参数?

    使用 Laravel 4 1 30 我得到了以下代码 该代码通过身份验证测试登录尝试 more codes here auth Auth attempt array email gt Input get email password gt
  • 为整个应用程序设置Python27 Google AppEngine默认编码

    我想将我的 python27 appengine 站点的默认编码设置为 utf 8 默认为 ascii 有一个类似的问题回答过http code google com p googleappengine issues detail id 5
  • 用于操作系统检测的 PHP 正则表达式

    我使用此代码来检测用户的操作系统