W dokumentacji czytam:
Użyj \ A i \ z, aby dopasować początek i koniec łańcucha, ^ i $ dopasuj początek / koniec linii.
Zamierzam zastosować wyrażenie regularne, aby sprawdzić nazwę użytkownika (lub adres e-mail jest taki sam) przesłaną przez użytkownika. Z jakim wyrażeniem powinienem korzystać validates_format_of
w modelu? Nie rozumiem różnicy: zawsze używałem ^ i $ ...
Odpowiedzi:
Jeśli zależysz od wyrażenia regularnego do sprawdzania poprawności, zawsze chcesz użyć
\A
i\z
.^
i$
będą pasować tylko do znaku nowej linii, co oznacza, że mogą użyć wiadomości e-mail podobnej do tej[email protected]\n<script>dangerous_stuff();</script>
i nadal ją sprawdzać, ponieważ regex widzi wszystko tylko przed\n
.Moim zaleceniem byłoby po prostu całkowite usunięcie nowych wierszy z nazwy użytkownika lub e-maila, ponieważ nie ma prawie żadnego uzasadnionego powodu. Następnie możesz bezpiecznie używać EITHER
\A
\z
lub^
$
.źródło
\z
zamiast\Z
!$
zamiast tego użyjesz „końca łańcucha”\z
.Według Pickaxe :
Więc używaj
\A
i małe litery\z
. Jeśli używasz,\Z
ktoś może się zakraść w znaku nowej linii. Myślę, że nie jest to niebezpieczne, ale może zepsuć algorytmy, które zakładają, że w łańcuchu nie ma białych znaków. W zależności od ograniczeń wyrażenia regularnego i długości łańcucha ktoś może użyć niewidzialnej nazwy z tylko znakiem nowej linii.Implementacja JavaScript w Regex traktuje
\A
jak literał'A'
( ref ). Uważaj więc na siebie i testuj.źródło
Początek i koniec łańcucha niekoniecznie musi być tym samym, co początek i koniec linii. Wyobraź sobie, że wykorzystałeś następujące parametry jako ciąg testowy:
Zauważ, że ciąg ma wiele wierszy - znaki
^
i$
pozwalają dopasować początek i koniec tych wierszy (zasadniczo traktując\n
znak jako ogranicznik),\A
a jednocześnie\Z
pozwalają dopasować początek i koniec całego łańcucha.źródło
Różnica według przykładu
/^foo$/
/\Afoo\z/
spełnia którekolwiek z poniższych kryteriów, nie:/^foo$/
i/\Afoo\z/
wszystkie pasują do następujących:źródło