Правила безопасности Firebase Регулярные выражения

Литералы регулярных выражений можно использовать для проверки строк, предоставленных клиентом. Используйте string.matches(/pattern/) чтобы проверить, соответствует ли строка шаблону регулярного выражения. Синтаксис регулярных выражений не идентичен синтаксису обычных регулярных выражений, в частности:

  • * + . ( ) [ ] { } \ работают в обычном режиме.
  • Якоря ^ и $ работают только в том случае, если мы используем их для сопоставления первого или последнего символа в шаблоне.
  • поддерживается только флаг модификатора i (игнорировать регистр)

Литералы

Литерал регулярного выражения вводится в выражение безопасности с помощью нотации /pattern/ . Чтобы проверить, соответствует ли строка шаблону регулярного выражения, используйте функцию-член match строки. Следующее правило сопоставления проверяет, начинаются ли новые данные со строки foo.

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

Поддерживаемые функции

Firebase поддерживает только часть типичных функций регулярных выражений. Однако синтаксис регулярных выражений должен показаться вам знакомым.

Поддерживаемые символы:

Характер Значение
\s \w \d \S \W \D предопределенные наборы символов для сопоставления пробелов, словесных символов или цифр и их отрицаний (соответственно)
\ escape, следующий символ интерпретируется буквально.
Если вы хотите найти совпадение с самим "", избегайте и его /\/
^ привязка к началу строки. Ее можно использовать только как первую букву шаблона.
/a/ соответствует «ba», а /^a/ — нет.
$ привязка к концу строки. Ее можно использовать только как последнюю букву шаблона.
/a/ соответствует «ab», а /a$/ — нет.
* соответствует нулю или многим из предыдущего шаблона.
/^a*$/ соответствует "" и "aaa", но не соответствует "b"
+ соответствует одному или нескольким предыдущим шаблонам.
/^a+$/ соответствует "a" и "aaa", но не соответствует ""
? соответствует нулю или одному из предыдущих шаблонов.
/^a?$/ соответствует "" и "a", но не соответствует "aa"
. соответствует любому персонажу
/......../ соответствует "Firebase"
(pattern) скобки группируют шаблон в единое целое
/(ab)*/ соответствует «абабу»
a|b соответствует либо a, либо b
/a|bc/ соответствует «ac» или «bc»
[akz] набор символов, соответствует любому из включенных символов.
/[ABCDEF]/ соответствует только заглавным буквам от A до F.
[az] интервал символов, соответствует всем символам включительно в указанном диапазоне.
/[0-9A-F]+/ соответствует шестнадцатеричным строкам
[^0-9] Ведущий ^ отменяет набор символов, сопоставляя все, что отличается от указанного набора символов.

i завершающий литеральную конструкцию регулярного выражения (например /yes/i ), указывает на то, что сопоставление будет нечувствительно к регистру. Другие модификаторы регулярных выражений в настоящее время не поддерживаются.

Сопоставление регулярных выражений в Firebase Realtime Database Security Rules не является ни жадным, ни нежадным, поскольку оно позволяет вам только обнаруживать совпадения, а не захватывать части строки.

Использование

Требовать, чтобы строка представляла собой дату в формате ГГГГ-ММ-ДД в диапазоне 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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"