在即時資料庫安全規則中使用規則運算式

規則運算式常值可用於驗證用戶端提供的字串。使用 string.matches(/pattern/) 測試字串是否符合規則運算式模式。規則運算式語法與一般規則運算式語法不盡相同,特別是:

  • * + . ( ) [ ] { } \ 正常運作。
  • 只有在比對模式中的第一個或最後一個字元時,^$ 錨點才有效。
  • 僅支援 i (不區分大小寫) 修飾符標記

文字

規則運算式常值會使用 /pattern/ 標記,導入安全性運算式。如要測試字串是否符合規則運算式模式,請使用字串的 matches 成員函式。下列比對規則會檢查新資料是否以字串 foo 開頭。

".validate": "newData.val().matches(/^foo/)"

支援功能

Firebase 僅支援部分常見的規則運算式功能。不過,規則運算式語法應該不難上手。

支援的符號如下:

角色 意義
\s \w \d \S \W \D 預先定義的字元集,用於比對空白字元、單字字元或數字,以及這些字元的否定形式 (分別)
\ 逸出,後續字元會以字面意義解讀。
如果要比對「」本身,也請逸出 /\/
^ 錨定至字串開頭。這只能做為模式的第一個字母。
/a/ 與「ba」相符,但 /^a/ 不相符。
$ 錨點至字串結尾。這只能做為模式的最後一個字母。
/a/ 與「ab」相符,但 /a$/ 不相符。
* 比對前接模式 0 次以上。
/^a*$/ 與「」和「aaa」相符,但不與「b」相符
+ 比對一或多個前接模式。
/^a+$/ 比對結果會包括「a」和「aaa」,但不包括「」
? 比對前一個模式零次或一次。
/^a?$/ 比對結果會包括「」和「a」,但不包括「aa」
. 比對任何字元
/......../ 比對「Firebase」
(pattern) 括號會將模式分組為單一單元
/(ab)*/ 符合「abab」
a|b 與 a 或 b 相符
/a|bc/ 與「ac」或「bc」相符
[akz] 字元集,比對任何包含的字元。
/[ABCDEF]/ 只會比對大寫字母 A 到 F。
[a-z] 字元間隔,比對指定範圍內的所有字元 (含範圍兩端)。
/[0-9A-F]+/ 比對十六進位字串
[^0-9] 開頭的 ^ 會否定字元集,比對指定字元集以外的任何內容。

在規則運算式常值建構項目 (例如 /yes/i) 後方加上 i,表示比對時不區分大小寫。目前不支援其他正規運算式修飾符。

Firebase 即時資料庫安全規則中的規則運算式比對既非貪婪比對,也非非貪婪比對,因為規則運算式只允許您偵測相符項目,而無法擷取字串的部分內容。

用量

要求字串為日期,格式為 YYYY-MM-DD,且介於 1900 年至 2099 年之間:

".validate": "newData.isString() && newData.val().matches(/^(19|20)[0-9][0-9][-\\/. ](0[1-9]|1[012])[-\\/. ](0[1-9]|[12][0-9]|3[01])$/)"

要求字串為電子郵件地址:

".validate": "newData.isString() && newData.val().matches(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i)"

要求字串為基本網址:

".validate": "newData.isString() && newData.val().matches(/^(ht|f)tp(s?):\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*((0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"