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

PHP 偵測瀏覽器類型與語言偏好實作指南

     編輯:PHP 相關知識

原理概述

HTTP 請求標頭中,`User-Agent` 描述客戶端瀏覽器資訊,`Accept-Language` 指出用戶偏好語言順序。PHP 透過 `$_SERVER` 超全域陣列即可存取這兩個值,配合字串搜尋或正則比對,即可實現基礎偵測。

快速取得原始資訊

<?php
// 瀏覽器完整 User-Agent 字串
echo $_SERVER['HTTP_USER_AGENT'] ?? '未提供';

// 語言偏好標頭(如 zh-TW,zh;q=0.9,en-US;q=0.8)
echo $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '未提供';

瀏覽器類型偵測實作

基礎版:字串搜尋

<?php
function detectBrowser(string $ua): string
{
    // 順序很重要:Chrome 的 UA 含 Safari,故 Chrome 必須先判斷
    if (str_contains($ua, 'Edg/'))       return 'Microsoft Edge';
    if (str_contains($ua, 'Chrome/'))    return 'Google Chrome';
    if (str_contains($ua, 'Firefox/'))   return 'Mozilla Firefox';
    if (str_contains($ua, 'Safari/'))    return 'Apple Safari';
    if (str_contains($ua, 'MSIE') || str_contains($ua, 'Trident/')) return 'Internet Explorer';
    if (str_contains($ua, 'Opera/') || str_contains($ua, 'OPR/')) return 'Opera';
    return 'Unknown';
}

// 使用
$browser = detectBrowser($_SERVER['HTTP_USER_AGENT'] ?? '');
echo "偵測到瀏覽器:$browser";

注意:PHP 8+ 可用 `str_contains()`,舊版請用 `strpos() !== false`。真實專案建議使用成熟函式庫(如 Jenssegers/Agent 或 piwik/device-detector),涵蓋裝置、作業系統、爬蟲等完整資訊。

語言偏好偵測實作

解析 `Accept-Language` 標頭

標頭格式範例:zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7
權重 `q` 值範圍 0~1,預設 1。應依權重排序,取最高者。

完整解析函式

<?php
function parseAcceptLanguage(string $header): array
{
    $langs = [];
    foreach (explode(',', $header) as $part) {
        $part = trim($part);
        $q = 1.0;
        if (strpos($part, ';q=') !== false) {
            [$tag, $qv] = explode(';q=', $part, 2);
            $q = (float)$qv;
            $part = $tag;
        }
        $part = strtolower(trim($part));
        if ($part) $langs[$part] = $q;
    }
    arsort($langs); // 依權重遞減
    return $langs;
}

function getPreferredLanguage(array $supported = ['zh-tw','zh-cn','en']): string
{
    $header = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
    $prefs = parseAcceptLanguage($header);
    foreach ($prefs as $lang => $q) {
        // 精確匹配
        if (in_array($lang, $supported, true)) return $lang;
        // 語系匹配(如 zh-tw -> zh)
        $primary = explode('-', $lang)[0];
        if (in_array($primary, $supported, true)) return $primary;
    }
    return $supported[0]; // 預設回退
}

// 使用
$lang = getPreferredLanguage(['zh-tw', 'zh-cn', 'en', 'ja', 'ko']);
echo "建議語言:$lang";

進階議題與限制

  • User-Agent 可偽造:不應用於安全決策(如權限控管),僅供分析、相容性調整。
  • 語言偏好 ≠ 地理位置:用戶可能設定英文介面但身在台灣,結合 GeoIP 更準確。
  • 快取考量:若頁面內容隨語言/瀏覽器不同而變化,需在回應加入 `Vary: User-Agent, Accept-Language` 標頭,避免 Proxy 快取錯誤版本。
  • 現代替代方案:Client Hints (`Sec-CH-UA` 等) 提供結構化資訊,漸成標準,建議並行支援。

結語

透過 `$_SERVER['HTTP_USER_AGENT']` 與 `$_SERVER['HTTP_ACCEPT_LANGUAGE']` 即可實現基礎偵測,但生產環境強烈建議採用維護中的解析函式庫,並謹記偵測結果僅供參考,不可作為信任依據。

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