Utiliser des expressions régulières dans les règles de sécurité Realtime Database

Les littéraux d'expression régulière peuvent être utilisés pour valider les chaînes fournies par le client. Utilisez string.matches(/pattern/) pour tester si une chaîne respecte un modèle d'expression régulière. La syntaxe des expressions régulières n'est pas identique à celle des expressions régulières courantes, en particulier :

  • * + . ( ) [ ] { } \ fonctionnent normalement.
  • Les ancres ^ et $ ne fonctionnent que si nous les utilisons pour faire correspondre le premier ou le dernier caractère du modèle.
  • seul l'indicateur de modificateur i (insensible à la casse) est accepté.

Littéraux

Un littéral d'expression régulière est introduit dans une expression de sécurité à l'aide de la notation /pattern/. Pour tester si une chaîne respecte un modèle d'expression régulière, utilisez la fonction membre matches de la chaîne. La règle de correspondance suivante vérifie si les nouvelles données commencent par la chaîne "foo".

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

Fonctionnalités disponibles

Firebase n'est compatible qu'avec un sous-ensemble des fonctionnalités d'expressions régulières classiques. Toutefois, la syntaxe des expressions régulières devrait vous être familière.

Voici les symboles acceptés :

Personnage Signification
\s \w \d \S \W \D Ensembles de caractères prédéfinis pour la correspondance des espaces blancs, d'un caractère de mot ou d'un chiffre, et leurs négations (respectivement)
\ d'échappement, le caractère suivant est interprété littéralement.
Si vous souhaitez faire correspondre "" lui-même, échappez-le également /\/
^ ancrer au début de la chaîne. Ce caractère ne peut être utilisé que comme première lettre du modèle.
/a/ correspond à "ba", mais pas /^a/.
$ ancre à la fin de la chaîne. Il ne peut être utilisé qu'en tant que dernière lettre du modèle.
/a/ correspond à "ab", mais pas /a$/.
* correspond à zéro ou plusieurs occurrences du modèle précédent.
/^a*$/ correspond à "" et "aaa", mais pas à "b".
+ correspond à une ou plusieurs occurrences du modèle précédent.
/^a+$/ correspond à "a" et "aaa", mais pas à ""
? correspond à zéro ou à un modèle précédent.
/^a?$/ correspond à "" et "a", mais pas à "aa".
. correspond à n'importe quel caractère ;
/......../ correspond à "Firebase"
(pattern) Les parenthèses regroupent un modèle en une seule unité.
/(ab)*/ correspond à "abab".
a|b correspond à a ou b
/a|bc/ correspond à "ac" ou "bc"
[akz] un ensemble de caractères, correspond à l'un des caractères inclus.
/[ABCDEF]/ ne correspond qu'aux lettres majuscules de A à F.
[a-z] un intervalle de caractères, correspond à tous les caractères inclus dans la plage spécifiée.
/[0-9A-F]+/ correspond aux chaînes hexadécimales
[^0-9] Un ^ en début de chaîne nie le jeu de caractères, en établissant une correspondance avec tout ce qui n'appartient pas au jeu de caractères spécifié.

Un i à la fin de la construction littérale de l'expression régulière (par exemple, /yes/i) indique que la correspondance ne sera pas sensible à la casse. Les autres modificateurs d'expressions régulières ne sont pas acceptés pour le moment.

Dans les règles de sécurité Firebase Realtime Database, la correspondance des expressions régulières n'est ni gourmande ni non gourmande, car elle vous permet uniquement de détecter une correspondance et non de capturer des parties de la chaîne.

Utilisation

Exiger qu'une chaîne soit une date au format AAAA-MM-JJ comprise entre 1900 et 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])$/)"

Exiger qu'une chaîne soit une adresse e-mail :

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

Exiger qu'une chaîne soit une URL de base :

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