Dans la documentation, j'ai lu:
Utilisez \ A et \ z pour correspondre au début et à la fin de la chaîne, ^ et $ correspondent au début / à la fin d'une ligne.
Je vais appliquer une expression régulière pour vérifier le nom d'utilisateur (ou l'e-mail est le même) soumis par l'utilisateur. Quelle expression dois-je utiliser validates_format_of
dans le modèle? Je ne comprends pas la différence: j'ai toujours utilisé ^ et $ ...
Réponses:
Si vous dépendez de l'expression régulière pour la validation, vous souhaitez toujours utiliser
\A
et\z
.^
et$
ne correspondra que jusqu'à un caractère de nouvelle ligne, ce qui signifie qu'ils pourraient utiliser un e-mail comme[email protected]\n<script>dangerous_stuff();</script>
et le faire valider, puisque l'expression régulière ne voit que tout avant le\n
.Ma recommandation serait simplement de supprimer complètement les nouvelles lignes d'un nom d'utilisateur ou d'un e-mail au préalable, car il n'y a pratiquement aucune raison légitime pour une. Ensuite, vous pouvez utiliser en toute sécurité SOIT
\A
\z
ou^
$
.la source
\z
au lieu de\Z
!$
de vérifier "fin de chaîne" au lieu de\z
.Selon Pickaxe :
Alors, utilisez
\A
et minuscules\z
. Si vous utilisez\Z
quelqu'un pourrait se faufiler dans un caractère de nouvelle ligne. Ce n'est pas dangereux je pense, mais cela pourrait bousiller les algorithmes qui supposent qu'il n'y a pas d'espace blanc dans la chaîne. En fonction de votre expression régulière et de vos contraintes de longueur de chaîne, quelqu'un pourrait utiliser un nom invisible avec juste un caractère de nouvelle ligne.L'implémentation de JavaScript de Regex est traitée
\A
comme un littéral'A'
( ref ). Alors surveillez-vous et testez.la source
Le début et la fin d'une chaîne ne sont pas nécessairement la même chose que le début et la fin d'une ligne. Imaginez si vous utilisiez ce qui suit comme chaîne de test:
Notez que la chaîne contient de nombreuses lignes - les caractères
^
et$
vous permettent de faire correspondre le début et la fin de ces lignes (en traitant essentiellement le\n
caractère comme un délimiteur)\A
et\Z
vous permettent de faire correspondre le début et la fin de la chaîne entière.la source
Différence par exemple
/^foo$/
correspond à l'un des éléments suivants,/\Afoo\z/
ne correspond pas:/^foo$/
et/\Afoo\z/
tous correspondent à ce qui suit:la source