HOWTO · PHP
如何在 PHP 中检测移动设备
了解如何使用 Mobile Detect 或用户代理模式,在 PHP 中将请求归类为移动设备。
本页内容
在 PHP 中,可以使用通过 Composer 安装的 mobiledetect 库,或从 $_SERVER 读取 HTTP_USER_AGENT 并用 preg_match() 匹配,将请求归类为来自移动设备。两种方法都是根据请求标头推断设备类别,无法证明发出请求的实际设备是什么。
在 PHP 中使用 mobiledetect 类检测移动设备
使用 Composer 在项目中安装 mobiledetect 库:composer require mobiledetect/mobiledetectlib。然后加载 Composer 的 vendor/autoload.php,并创建一个 Mobile_Detect 实例。该库会根据请求信息(包括用户代理字符串和其他标头)对客户端进行分类。
如需进行基本的移动设备检查,可以调用 $detect->isMobile()。它会返回一个布尔值,你可以在 if/else 分支中据此选择移动设备或非移动设备对应的结果。如果应用需要将平板单独处理,该类还提供了 isTablet();使用范围更广的移动设备分类之前,应先决定平板检测结果会如何影响布局或功能。
这种分类反映的是 PHP 收到的请求。更改浏览器响应式设计模式中模拟的设备时,浏览器可能会发送不同的用户代理,但这并不能验证代码在每一种实体手机或平板上的行为。用户代理值可以被修改,因此客户端检测不应作为安全或身份验证手段。
在 PHP 中使用 HTTP_USER_AGENT 和 preg_match() 函数检测移动设备
如果不想依赖额外的库,可以从 $_SERVER 超全局变量读取 HTTP_USER_AGENT,并用一组简短的移动设备相关词语进行匹配。该键可能不存在,因此调用 preg_match() 前应提供字符串默认值。下面的示例检查一个 iPhone 用户代理样例;在 Web 请求中,PHP 会从请求标头中取得该值。
<?php
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)';
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$pattern = '/(android|iphone|ipod|ipad|mobile|tablet)/i';
$isMobile = preg_match($pattern, $userAgent) === 1;
echo $isMobile ? 'Mobile device detected' : 'Mobile device not detected';
匹配成功时,preg_match() 返回 1;不匹配时返回 0;如果无法评估模式,则返回 false。使用 === 1 进行比较,可确保分支只在匹配成功时执行。真实请求缺少该标头时,默认值为空字符串,此模式会进入非移动设备分支。
应将此结果视为粗略分类。用户代理字符串可能缺失、被修改或发生变化;手动维护的简短模式也可能漏掉较新的客户端或较少见的客户端。即使列出更多模式,也不能保证覆盖所有情况。关于移动设备用户代理字符串的 Stack Overflow 讨论由社区维护,采用其中的建议前应仔细评估是否适合你的应用。