在 Web 开发中,获取客户端的版本信息(如浏览器、操作系统、设备类型等)是一个常见需求。无论是用于统计分析、功能兼容性判断,还是个性化展示,准确地识别客户端环境都能显著提升用户体验。
PHP 自带的 $_SERVER['HTTP_USER_AGENT'] 提供了基本的客户端信息,但解析它的工作却并不轻松。为了让这项任务变得更高效、便捷,我们可以封装一个功能更强大的 get_client_version 函数工具类,实现自动识别浏览器、操作系统、设备类型甚至 APP 版本等功能。
直接使用原始的 User-Agent 字符串存在如下痛点:
字符串格式不统一,解析规则复杂
浏览器、操作系统版本更新频繁,识别方式常常失效
缺乏灵活性和扩展性,难以应对多端应用需求
为了克服这些问题,我们需要一个结构化、模块化、可扩展的工具类。
我们计划创建一个 ClientVersionHelper 类,具备如下能力:
自动识别浏览器类型与版本(Chrome, Firefox, Safari 等)
自动识别操作系统及版本(Windows, macOS, Linux, Android, iOS)
判断是否为移动设备
支持自定义应用版本头识别(如自研 App 的 UA 格式)
提供统一的结构化返回格式
下面是一个基本实现,后续你可以根据项目需求进一步扩展:
<?php
class ClientVersionHelper
{
protected $userAgent;
public function __construct($userAgent = null)
{
$this->userAgent = $userAgent ?: ($_SERVER['HTTP_USER_AGENT'] ?? '');
}
public function getClientInfo()
{
return [
'browser' => $this->getBrowser(),
'os' => $this->getOS(),
'device' => $this->isMobile() ? 'Mobile' : 'Desktop',
'raw' => $this->userAgent,
];
}
protected function getBrowser()
{
$ua = $this->userAgent;
if (preg_match('/Chrome\/([0-9\.]+)/i', $ua, $matches)) {
return 'Chrome ' . $matches[1];
}
if (preg_match('/Firefox\/([0-9\.]+)/i', $ua, $matches)) {
return 'Firefox ' . $matches[1];
}
if (preg_match('/Safari\/([0-9\.]+)/i', $ua) && !preg_match('/Chrome/i', $ua)) {
return 'Safari';
}
if (preg_match('/MSIE ([0-9\.]+)/i', $ua, $matches)) {
return 'Internet Explorer ' . $matches[1];
}
return 'Unknown';
}
protected function getOS()
{
$ua = $this->userAgent;
if (preg_match('/Windows NT ([0-9\.]+)/i', $ua, $matches)) {
return 'Windows ' . $matches[1];
}
if (preg_match('/Mac OS X ([0-9_\.]+)/i', $ua, $matches)) {
return 'macOS ' . str_replace('_', '.', $matches[1]);
}
if (preg_match('/Android ([0-9\.]+)/i', $ua, $matches)) {
return 'Android ' . $matches[1];
}
if (preg_match('/iPhone OS ([0-9_]+)/i', $ua, $matches)) {
return 'iOS ' . str_replace('_', '.', $matches[1]);
}
if (preg_match('/Linux/i', $ua)) {
return 'Linux';
}
return 'Unknown';
}
protected function isMobile()
{
return preg_match('/Mobile|Android|iPhone|iPad/i', $this->userAgent);
}
}
只需简单调用即可获取结构化的客户端版本信息:
$clientHelper = new ClientVersionHelper();
$info = $clientHelper->getClientInfo();
echo '<pre>';
print_r($info);
echo '</pre>';
返回结果示例如下:
Array
(
[browser] => Chrome 120.0.0.0
[os] => Windows 10.0
[device] => Desktop
[raw] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
)
你可以在现有基础上加入以下扩展:
添加对自定义 UA 标识符的支持,例如你自己的 APP UA 中带有 MyApp/3.4.5
整合 UA 数据库(如 https://gitbox.net/ua-database)以支持更多设备识别
提供缓存机制,提高处理效率
将该类封装为 Composer 包,便于复用和更新
封装一个高效的 get_client_version 工具类,不仅能大大简化客户端识别的代码逻辑,也能让你的应用更具可维护性和扩展性。与其每次都去手动解析 User-Agent,不如交给一个强大、可靠的工具类来处理。
随着设备和浏览器类型的不断增多,一个良好的封装将使你的项目在用户识别方面始终处于领先位置。