En la documentación leí:
Use \ A y \ z para hacer coincidir el inicio y el final de la cadena, ^ y $ coinciden con el inicio / final de una línea.
Voy a aplicar una expresión regular para verificar el nombre de usuario (o el correo electrónico es el mismo) enviado por el usuario. ¿Con qué expresión debo usar validates_format_of
en el modelo? No puedo entender la diferencia: siempre he usado ^ y $ ...
Respuestas:
Si depende de la expresión regular para la validación, siempre desea usar
\A
y\z
.^
y$
solo coincidirá hasta un carácter de nueva línea, lo que significa que podrían usar un correo electrónico como[email protected]\n<script>dangerous_stuff();</script>
y aún así validarlo, ya que la expresión regular solo ve todo antes del\n
.Mi recomendación sería eliminar completamente las nuevas líneas de un nombre de usuario o correo electrónico de antemano, ya que no hay una razón legítima para ello. Entonces puede usar con seguridad ya
\A
\z
sea^
$
.fuente
\z
lugar de\Z
!$
verificar el "final de la cadena" en lugar de\z
.De acuerdo con Pickaxe :
Entonces, use
\A
y minúsculas\z
. Si usa a\Z
alguien podría colarse en un personaje de nueva línea. Creo que esto no es peligroso, pero podría arruinar algoritmos que suponen que no hay espacios en blanco en la cadena. Dependiendo de sus restricciones de expresión regular y longitud de cadena, alguien podría usar un nombre invisible con solo un carácter de nueva línea.La implementación de JavaScript de Regex trata
\A
como un literal'A'
( ref ). Así que ten cuidado y prueba.fuente
El inicio y el final de una cadena pueden no ser necesariamente lo mismo que el inicio y el final de una línea. Imagínese si usara lo siguiente como su cadena de prueba:
Tenga en cuenta que la cadena tiene muchas líneas: los caracteres
^
y le$
permiten hacer coincidir el principio y el final de esas líneas (básicamente, tratan el\n
carácter como un delimitador)\A
y le\Z
permiten hacer coincidir el principio y el final de toda la cadena.fuente
Diferencia por ejemplo
/^foo$/
coincide con cualquiera de los siguientes,/\Afoo\z/
no:/^foo$/
y/\Afoo\z/
todos coinciden con lo siguiente:fuente