透過 $_SERVER['HTTP_USER_AGENT'] 識別瀏覽器類型、版本、作業系統;透過 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 判斷使用者偏好語言。可用於相容性處理、多語系導向、統計分析。
<?php
function getBrowserInfo() {
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$browser = 'Unknown';
$version = '';
// 依優先序匹配(順序重要,避免 Chrome 被誤判為 Safari)
$patterns = [
'/Edg\/([\d.]+)/i' => 'Edge',
'/OPR\/([\d.]+)/i' => 'Opera',
'/Chrome\/([\d.]+)/i' => 'Chrome',
'/Firefox\/([\d.]+)/i' => 'Firefox',
'/Safari\/([\d.]+)/i' => 'Safari',
'/MSIE ([\d.]+)/i' => 'IE',
'/Trident\/.*rv:([\d.]+)/i' => 'IE 11',
];
foreach ($patterns as $pattern => $name) {
if (preg_match($pattern, $ua, $matches)) {
$browser = $name;
$version = $matches[1] ?? '';
break;
}
}
// 作業系統判斷
$os = 'Unknown';
$osPatterns = [
'/Windows NT 10\.0/i' => 'Windows 10',
'/Windows NT 6\.3/i' => 'Windows 8.1',
'/Windows NT 6\.2/i' => 'Windows 8',
'/Windows NT 6\.1/i' => 'Windows 7',
'/Mac OS X ([\d_]+)/i' => 'macOS',
'/Linux/i' => 'Linux',
'/Android ([\d.]+)/i' => 'Android',
'/iPhone OS ([\d_]+)/i' => 'iOS',
];
foreach ($osPatterns as $pattern => $name) {
if (preg_match($pattern, $ua, $matches)) {
$os = $name . ($matches[1] ? ' ' . str_replace('_', '.', $matches[1]) : '');
break;
}
}
return [
'browser' => $browser,
'version' => $version,
'os' => $os,
'ua' => $ua,
];
}
// 使用
$info = getBrowserInfo();
echo "{$info['browser']} {$info['version']} on {$info['os']}";
<?php
function getPreferredLanguage() {
$acceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
if (!$acceptLang) return 'en'; // 預設英文
// 解析 q-value 權重
$langs = [];
foreach (explode(',', $acceptLang) as $part) {
$part = trim($part);
$q = 1.0;
if (strpos($part, ';q=') !== false) {
list($lang, $qStr) = explode(';q=', $part);
$q = (float)$qStr;
} else {
$lang = $part;
}
$lang = strtolower($lang);
$langs[$lang] = $q;
}
arsort($langs); // 依權重遞減排序
// 取最高權重的主要語言代碼(前兩字元)
$topLang = key($langs);
$primary = substr($topLang, 0, 2);
// 對應繁簡中文
$map = [
'zh' => 'zh_TW', // 預設繁體,可依地區細分
'zh-cn' => 'zh_CN',
'zh-tw' => 'zh_TW',
'zh-hk' => 'zh_HK',
'en' => 'en_US',
'ja' => 'ja_JP',
'ko' => 'ko_KR',
];
return $map[$topLang] ?? $map[$primary] ?? 'en_US';
}
// 使用
$lang = getPreferredLanguage();
// header("Location: /{$lang}/"); // 導向對應語系頁面
<?php
session_start();
// 1. 優先使用使用者手動選擇
if (isset($_GET['lang'])) {
$_SESSION['lang'] = $_GET['lang'];
}
// 2. 次優先使用 Session
elseif (isset($_SESSION['lang'])) {
$lang = $_SESSION['lang'];
}
// 3. 再次優先偵測瀏覽器語言
else {
$lang = getPreferredLanguage();
$_SESSION['lang'] = $lang;
}
// 載入語系檔
$langFile = __DIR__ . "/lang/{$lang}.php";
if (file_exists($langFile)) {
$translations = include $langFile;
} else {
$translations = include __DIR__ . "/lang/en_US.php";
}
// 模板中使用:echo $translations['welcome'];
?>
Chrome/120.0.6099.109),視需求取主版本號。zh-TW,zh;q=0.9,en-US;q=0.8),建議使用成熟庫(如 willdurand/negotiation)。piwik/device-detector。