นิพจน์ทั่วไปของกฎความปลอดภัย Firebase

ตัวอักษรนิพจน์ทั่วไปสามารถใช้เพื่อตรวจสอบสตริงที่ไคลเอ็นต์ระบุ ใช้ string.matches(/pattern/) เพื่อทดสอบว่าสตริงเป็นไปตามรูปแบบนิพจน์ทั่วไปหรือไม่ ไวยากรณ์ของนิพจน์ทั่วไปไม่เหมือนกับไวยากรณ์ของนิพจน์ทั่วไปทั่วไป โดยเฉพาะ:

  • * + . ( ) [ ] { } \ ทำงานตามปกติ
  • จุดยึด ^ และ $ ใช้งานได้เฉพาะเมื่อเราใช้มันเพื่อจับคู่อักขระตัวแรกหรือตัวสุดท้ายในรูปแบบ
  • รองรับเฉพาะแฟล็กตัวแก้ไข i (ละเว้นตัวพิมพ์) เท่านั้นที่ได้รับการสนับสนุน

ตัวอักษร

ลิเทอรัลของนิพจน์ทั่วไปถูกนำมาใช้ในนิพจน์การรักษาความปลอดภัยโดยใช้สัญลักษณ์ /pattern/ หากต้องการทดสอบว่าสตริงเป็นไปตามรูปแบบนิพจน์ทั่วไปหรือไม่ ให้ใช้ฟังก์ชันที่ตรงกับสมาชิกของสตริง กฎการจับคู่ต่อไปนี้จะตรวจสอบว่าข้อมูลใหม่เริ่มต้นด้วยสตริง foo หรือไม่

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

คุณสมบัติที่รองรับ

Firebase รองรับฟีเจอร์นิพจน์ทั่วไปทั่วไปเพียงบางส่วนเท่านั้น อย่างไรก็ตาม ไวยากรณ์ของนิพจน์ทั่วไปควรให้ความรู้สึกคุ้นเคย

เหล่านี้คือสัญลักษณ์ที่รองรับ:

อักขระ ความหมาย
\s \w \d \S \W \D ชุดอักขระที่กำหนดไว้ล่วงหน้าสำหรับการจับคู่ช่องว่าง อักขระคำ หรือตัวเลข และการปฏิเสธ (ตามลำดับ)
\ หลบหนี อักขระต่อไปนี้จะถูกตีความตามตัวอักษร
หากต้องการจับคู่กับ "" เอง ให้หลีกเลี่ยงด้วย /\/
^ ยึดที่จุดเริ่มต้นของสตริง ซึ่งสามารถใช้เป็นตัวอักษรตัวแรกของรูปแบบเท่านั้น
/a/ ตรงกับ "ba" ในขณะที่ /^a/ ไม่ตรงกัน
$ ยึดที่ส่วนท้ายของสตริง ซึ่งสามารถใช้เป็นตัวอักษรตัวสุดท้ายของรูปแบบเท่านั้น
/a/ ตรงกับ "ab" ในขณะที่ /a$/ ไม่ตรงกับ
* ตรงกับศูนย์หรือหลายรูปแบบก่อนหน้า
/^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
[az] ช่วงอักขระ จะจับคู่อักขระทั้งหมดในช่วงที่ระบุ
/[0-9A-F]+/ จับคู่สตริงเลขฐานสิบหก
[^0-9] ^ นำหน้าจะลบล้างชุดอักขระ โดยจับคู่สิ่งอื่นใดนอกเหนือจากชุดอักขระที่ระบุ

การที่ i ต่อท้ายโครงสร้างตามตัวอักษรของนิพจน์ทั่วไป (เช่น /yes/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)"

กำหนดให้สตริงเป็น URL พื้นฐาน:

".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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"