Warning: preg_match(): Compilation failed: missing terminating ] for character class at offset 14
$pattern = '/[\<>\'\"\ \ \]/'; // 錯誤:] 被視為字元類別結束
if (preg_match($pattern, $username)) { ... }
在字元類別 [...] 內部,] 若未轉義會被視為結束符號。原寫法 \] 在雙引號字串中實際為 ],導致正則引擎以為類別在 \ 後結束,隨後缺少終止符號。
// 使用單引號避免雙重轉義,並對 ] 轉義
$pattern = '/[<>\'\" \\\\ \\]]/';
// 或使用 preg_quote 自動轉義特殊字元
$pattern = '/[' . preg_quote('<>\'\" []', '/') . ']/';
/^[a-zA-Z0-9_]{4,20}$/),比黑名單更安全。check() 應回傳 bool,而非直接輸出 JS,便於控制流程。function check($username) {
$pattern = '/^[a-zA-Z0-9_]{4,20}$/'; // 白名單:字母數字下劃線 4-20 位
return preg_match($pattern, $username);
}
// 註冊頁面
if (!check($_POST['username'])) {
echo "<script>alert('用戶名格式錯誤');history.back();</script>";
exit;
}