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

PHP 判斷瀏覽器語言偏好:基於 HTTP_ACCEPT_LANGUAGE 的正則實作

     編輯:PHP 相關知識

多語系網站常需依訪客瀏覽器語言偏好自動切換介面。PHP 透過超級全域變數 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 即可取得原始標頭,配合正則表達式解析優先語言代碼。

核心邏輯解析

Accept-Language 標頭格式如 zh-TW,zh;q=0.9,en-US;q=0.8,優先順序由 q 值決定。簡易做法擷取前 4 字元(如 zh-T、en-U)進行比對:

<?php
function detectBrowserLanguage() {
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4);
    
    if (preg_match('/zh-c/i', $lang)) return 'zh-CN';      // 簡體中文
    if (preg_match('/zh/i', $lang)) return 'zh-TW';        // 繁體中文
    if (preg_match('/en/i', $lang)) return 'en-US';        // 英文
    if (preg_match('/fr/i', $lang)) return 'fr-FR';        // 法文
    if (preg_match('/de/i', $lang)) return 'de-DE';        // 德文
    if (preg_match('/ja/i', $lang)) return 'ja-JP';        // 日文
    if (preg_match('/ko/i', $lang)) return 'ko-KR';        // 韓文
    if (preg_match('/es/i', $lang)) return 'es-ES';        // 西班牙文
    if (preg_match('/sv/i', $lang)) return 'sv-SE';        // 瑞典文
    
    return $_SERVER['HTTP_ACCEPT_LANGUAGE']; // 回傳原始值供進一步處理
}

// 使用方式
$locale = detectBrowserLanguage();
echo "偵測語言: $locale";

進階解析:完整支援 q 值排序

若需精確處理權重,可進一步解析完整標頭:

function parseAcceptLanguage($header) {
    $langs = array();
    foreach (explode(',', $header) as $part) {
        $part = trim($part);
        if (strpos($part, ';q=') !== false) {
            list($code, $q) = explode(';q=', $part);
            $langs[trim($code)] = (float)$q;
        } else {
            $langs[$part] = 1.0;
        }
    }
    arsort($langs); // 依權重遞減排序
    return $langs;
}

$prefs = parseAcceptLanguage($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$firstChoice = key($prefs); // 最高優先權語言

實務建議

  • 語言代碼建議遵循 BCP 47 標準(如 zh-Hant-TW)
  • 提供使用者手動切換選單,並將偏好存入 Cookie/Session 覆蓋自動偵測
  • 注意行動裝置瀏覽器可能送出不同格式,測試時需涵蓋主流 UA
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved