Literais de expressão regular podem ser usados para validar strings fornecidas pelo cliente. Use string.matches(/pattern/)
para testar se uma string segue um padrão de expressão regular. A sintaxe da expressão regular não é idêntica à sintaxe das expressões regulares comuns, em particular:
-
*
+
.
(
)
[
]
{
}
\
funciona normalmente. - As âncoras
^
e$
só funcionam se as usarmos para corresponder ao primeiro ou último caractere do padrão. - apenas o sinalizador modificador
i
(ignorar maiúsculas e minúsculas) é suportado
Literais
Um literal de expressão regular é introduzido em uma expressão de segurança usando a notação /pattern/
. Para testar se uma string segue um padrão de expressão regular, use a função de membro matches de string. A seguinte regra de correspondência verifica se os novos dados começam com a string foo.
".validate": "newData.val().matches(/^foo/)"
Recursos suportados
O Firebase oferece suporte apenas a um subconjunto de recursos típicos de expressões regulares. No entanto, a sintaxe da expressão regular deve parecer familiar.
Estes são os símbolos suportados:
Personagem | Significado |
---|---|
\s \w \d \S \W \D | conjuntos de caracteres predefinidos para correspondência de espaço em branco, caractere de palavra ou dígito e suas negações (respectivamente) |
\ | escape, o caractere seguinte é interpretado literalmente. Se você quiser combinar com "" em si, escape também /\/ |
^ | âncora no início da string. Isso só pode ser usado como a primeira letra do padrão./a/ corresponde a "ba", enquanto /^a/ não. |
$ | âncora no final da corda. Isso só pode ser usado como a última letra do padrão./a/ corresponde a "ab", enquanto /a$/ não. |
* | corresponde a zero ou muitos do padrão anterior./^a*$/ corresponde a "" e "aaa", mas não a "b" |
+ | corresponde a um ou mais dos padrões anteriores./^a+$/ corresponde a "a" e "aaa", mas não a "" |
? | corresponde a zero ou um dos padrões anteriores./^a?$/ corresponde a "" e "a", mas não a "aa" |
. | corresponde a qualquer caractere/......../ corresponde a "Firebase" |
(pattern) | parênteses agrupa um padrão em uma única unidade/(ab)*/ corresponde a "abab" |
a|b | corresponde a a ou b/a|bc/ corresponde a "ac" ou "bc" |
[akz] | um conjunto de caracteres corresponde a qualquer um dos caracteres incluídos./[ABCDEF]/ corresponde apenas a letras maiúsculas de A a F. |
[az] | um intervalo de caracteres, corresponde a todos os caracteres inclusive no intervalo especificado./[0-9A-F]+/ corresponde a strings hexadecimais |
[^0-9] | Um ^ inicial nega o conjunto de caracteres, correspondendo a qualquer coisa diferente do conjunto de caracteres especificado. |
Um i
à direita da construção literal da expressão regular (por exemplo /yes/i
) indica que a correspondência não diferencia maiúsculas de minúsculas. Outros modificadores de expressões regulares não são suportados no momento.
A correspondência de expressões regulares nas regras de segurança do Firebase Realtime Database não é gananciosa nem não gananciosa, pois permite apenas detectar uma correspondência e não capturar partes da string.
Uso
Exija que uma string seja uma data formatada como AAAA-MM-DD entre 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])$/)"
Exigir que a string seja um endereço de e-mail:
".validate": "newData.isString() && newData.val().matches(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i)"
Exigir que a string seja um URL básico:
".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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"