Web 開發常需在 CSS 十六進位顏色 (如 #FF5500、#F50) 與 RGB 數值 (如 rgb(255, 85, 0)) 之間轉換。本文提供一個健全的 hex2rgb() 函式,支援 3 位與 6 位縮寫、可選 # 前綴、輸入驗證,並回傳關聯陣列或 false 表示失敗。
<?php
/**
* 將十六進位顏色字串轉換為 RGB 陣列
* @param string $hex 顏色字串,支援 '#RRGGBB', 'RRGGBB', '#RGB', 'RGB'
* @return array|false 成功回傳 ['red'=>int, 'green'=>int, 'blue'=>int],失敗回傳 false
*/
function hex2rgb(string $hex): array|false {
// 1. 移除可選的 # 前綴
$hex = ltrim($hex, '#');
// 2. 驗證長度與字元合法性 (只允許 0-9, a-f, A-F)
if (!preg_match('/^([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/', $hex)) {
return false;
}
// 3. 展開 3 位縮寫為 6 位 (如 'F50' -> 'FF5500')
if (strlen($hex) === 3) {
$hex = $hex[0].$hex[0] . $hex[1].$hex[1] . $hex[2].$hex[2];
}
// 4. 十六進位轉十進位
$r = hexdec(substr($hex, 0, 2));
$g = hexdec(substr($hex, 2, 2));
$b = hexdec(substr($hex, 4, 2));
return [
'red' => $r,
'green' => $g,
'blue' => $b,
];
}
// 別名:回傳 'rgb(r, g, b)' 字串
function hex2rgbString(string $hex): string|false {
$rgb = hex2rgb($hex);
return $rgb ? "rgb({$rgb['red']}, {$rgb['green']}, {$rgb['blue']})" : false;
}
?>
<?php
$tests = ['#eeeeee', 'eeeeee', '#F50', 'F50', '#FF5500', 'invalid', '#GGG'];
foreach ($tests as $color) {
$result = hex2rgb($color);
echo "輸入: $color → ";
var_dump($result);
// 輸出:
// 輸入: #eeeeee → array(3) { ["red"]=> int(238) ["green"]=> int(238) ["blue"]=> int(238) }
// 輸入: #F50 → array(3) { ["red"]=> int(255) ["green"]=> int(85) ["blue"]=> int(0) }
// 輸入: invalid → bool(false)
}
?>
<?php
function rgb2hex(int $r, int $g, int $b): string {
// 限制範圍 0-255
$r = max(0, min(255, $r));
$g = max(0, min(255, $g));
$b = max(0, min(255, $b));
return sprintf('#%02X%02X%02X', $r, $g, $b);
}
// 測試
echo rgb2hex(238, 238, 238); // #EEEEEE
echo rgb2hex(255, 85, 0); // #FF5500
?>
style="color: rgb(...)" 或動態 CSS 變數。若專案使用 PHP 8.1+,可善用 readonly class 封裝為 Color 實體物件:
readonly class Color {
public function __construct(
public int $red,
public int $green,
public int $blue
) {}
public static function fromHex(string $hex): self|false {
$rgb = hex2rgb($hex);
return $rgb ? new self($rgb['red'], $rgb['green'], $rgb['blue']) : false;
}
public function toHex(): string {
return sprintf('#%02X%02X%02X', $this->red, $this->green, $this->blue);
}
public function toRgbString(): string {
return "rgb($this->red, $this->green, $this->blue)";
}
}
掌握 Hex 與 RGB 雙向轉換,是前後端顏色處理的基礎技能,配合正則驗證與型別宣告,能寫出健壯且可維護的程式碼。