首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP preg_match 編譯失敗:修正正則表達式缺少右中括號錯誤

     編輯:程式設計綜合問答

錯誤訊息

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,便於控制流程。
  • 前後端分離:瀏覽器不影響 PHP 正則編譯,勿混淆前後端錯誤來源。

修正後範例

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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved