首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 解析 User-Agent 取得瀏覽器與作業系統資訊:從正則到專用庫的最佳實務

     編輯:PHP 相關知識

前言:User-Agent 解析的挑戰

User-Agent 字串歷經數十年演變,格式混亂、偽裝普遍、新裝置層出不窮。手寫正則極難維護且準確率低。現代專案強烈建議使用專用庫。

方案對比

方案語言準確率維護性效能推薦度
UAParser (PHP)PHP★★★★★★★★★★ (YAML 規則自動更新)~0.5ms✅ 首選
WhichBrowserPHP★★★★☆★★★★☆~1ms✅ 備選
get_browser()PHP 內建★★☆☆☆★☆☆☆☆ (browscap.ini 手動更新)~2ms❌ 不推薦
手寫正則PHP★☆☆☆☆★☆☆☆☆~0.1ms❌ 禁用
DeviceDetectorPHP★★★★★★★★★★~1.5ms✅ 功能最全

推薦:UAParser (PHP) 完整用法

# Composer
composer require ua-parser/uaparser

# 程式碼
use UAParser\Parser;

$parser = Parser::create(); // 內建 regexes.yaml (自動更新可用 composer script)

$ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1';
$result = $parser->parse($ua);

echo "瀏覽器: {$result->ua->family} {$result->ua->major}.{$result->ua->minor}\n";
echo "作業系統: {$result->os->family} {$result->os->major}.{$result->os->minor}\n";
echo "裝置: {$result->device->family} ({$result->device->brand})\n";
echo "是否行動裝置: " . ($result->device->isMobile() ? '是' : '否') . "\n";
/*
瀏覽器: Mobile Safari 17.2
作業系統: iOS 17.2
裝置: iPhone (Apple)
是否行動裝置: 是
*/

進階:DeviceDetector (含裝置品牌、機器人偵測、客戶端提示)

composer require piwik/device-detector

use DeviceDetector\DeviceDetector;
use DeviceDetector\Cache\DoctrineCache;
use Doctrine\Common\Cache\ArrayCache;

$dd = new DeviceDetector($ua);
$dd->setCache(new DoctrineCache(new ArrayCache())); // 快取解析結果
$dd->parse();

if ($dd->isBot()) {
    echo "Bot: {$dd->getBotName()} ({$dd->getBotUrl()})";
} else {
    echo "Client: {$dd->getClient()->getName()} {$dd->getClient()->getVersion()}";
    echo "OS: {$dd->getOs()->getName()} {$dd->getOs()->getVersion()}";
    echo "Device: {$dd->getDeviceName()} ({$dd->getBrand()})";
    echo "Is Mobile: " . ($dd->isMobile() ? 'yes' : 'no');
}

Client Hints (現代替代 User-Agent)

Chrome 89+ 支援 Sec-CH-UA-* 標頭,提供結構化、隱私保護的裝置資訊:


// PHP 取得 Client Hints
$secChUa = $_SERVER['HTTP_SEC_CH_UA'] ?? '';           // "Not A(Brand";v="99", "Google Chrome";v="120"
$secChUaMobile = $_SERVER['HTTP_SEC_CH_UA_MOBILE'] ?? ''; // ?0 or ?1
$secChUaPlatform = $_SERVER['HTTP_SEC_CH_UA_PLATFORM'] ?? ''; // "Windows"
// 解析建議仍用 UAParser (支援 Client Hints 格式)

快取策略 (高流量必備)

// Redis 快取 UA 解析結果 (TTL 30 天)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'ua:' . md5($ua);
$cached = $redis->get($cacheKey);
if ($cached) return json_decode($cached, true);

$result = $parser->parse($ua)->toArray(); // UAParser 結果轉陣列
$redis->setex($cacheKey, 2592000, json_encode($result));
return $result;

常見用途與資料結構

用途所需欄位範例
相容性提示browser.family, browser.major, os.familyIE 11 → 顯示升級提示
行動版導向device.isMobile(), device.familyiPhone/Android → 導向 m.example.com
分析報表browser.family, os.family, device.brand統計 Chrome/Windows/iPhone 佔比
機器人識別DeviceDetector::isBot()Googlebot → 允許爬取、不計入廣告曝光
安全風控UA 異常 (空、已知攻擊工具)、Client Hints 不一致封鎖可疑請求

完整整合範例 (Laravel Service Provider、Middleware、Console 更新規則) 見 GitHub。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved