elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [Pregunta]: Problema con expresión regular
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Pregunta]: Problema con expresión regular  (Leído 2,056 veces)
Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
[Pregunta]: Problema con expresión regular
« en: 3 Octubre 2019, 01:20 am »

Buenas noches,
antes de perder la cabeza quería comentarles el problema que estoy teniendo para validar lo siguiente:

La cadena sería (20 números) + (2 letras mayúsculas)

estuve intentando con lo siguiente y otros métodos pero no me sirven:

Código
  1. form_verify_email.verify_code.value = String(form_verify_email.verify_code.value).replace(/[^0-9]{20}[^A-Z]{21,22}/g, '');
  2.  


En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: [Pregunta]: Problema con expresión regular
« Respuesta #1 en: 3 Octubre 2019, 02:07 am »

El otro post ya te pase una página donde podías hacer pruebas de regex y aprender a hacerlo pues dicha página te explica el regex que tienes. Vamos a explicar el tuyo.

Primero tienes esto:
Código
  1. [^0-9]{20}

Esto es un set negativo donde buscas cualquier cosa que NO sea un número de 0-9 y que tenga una longitud de 20 caracteres.

Luego tienes esto:
Código
  1. [^A-Z]{21,22}

Otro set negativo donde buscas cualquier cosa que NO sea A-Z y que tenga una longitud de entre 21 y 22 caracteres.


Entonces, lo que le estamos diciendo es, reemplazame, aquellos strings donde haya especificamente 20 caracteres que NO sean un número seguido de 21 o 22 caracteres que no sean mayúsculas... Supongo que ya puedes ver el fallo.


Aquí no tienes que buscar reemplazar (sanitizar), tienes que validar. Es decir, no buscas un replace, buscas que el valor sea especificamente el formato que le estas indicando (test). Por tanto, verifica que de principio (^) a fin ($), el texto contiene exactamente 20 caracteres numéricos y 2 letras mayúsculas. O lo que es lo mismo:


Código
  1. const tests = [
  2.  '1234567890AB',
  3.  '1234567890AB1234567890',
  4.  '12345678901234567890AABB',
  5.  '123456789012345678901A',
  6.  '1234567890123456789AB2',
  7.  '$$$$$$$$$$$$$$$$$$$$00',
  8.  'dsakdsakldjaksljdklasa',
  9.  'askjdasdjklasjdkasjd12',
  10.  '12345678901234567890AB',
  11. ];
  12.  
  13. const regexCode = /[0-9]{20}[A-Z]{2}$/g;
  14.  
  15. tests.forEach(function(value) {
  16.  
  17.  if (!regexCode.test(value)) {
  18.    console.log(value + ' no es un codigo valido');
  19.  }
  20.  
  21. });

El único que no te saltara como no valido es el ultimo (12345678901234567890AB) puesto que cumple con las condiciones.

Saludos


En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: Problema con expresión regular
« Respuesta #2 en: 3 Octubre 2019, 02:20 am »

El otro post ya te pase una página donde podías hacer pruebas de regex y aprender a hacerlo pues dicha página te explica el regex que tienes. Vamos a explicar el tuyo.

Primero tienes esto:
Código
  1. [^0-9]{20}

Esto es un set negativo donde buscas cualquier cosa que NO sea un número de 0-9 y que tenga una longitud de 20 caracteres.

Luego tienes esto:
Código
  1. [^A-Z]{21,22}

Otro set negativo donde buscas cualquier cosa que NO sea A-Z y que tenga una longitud de entre 21 y 22 caracteres.


Entonces, lo que le estamos diciendo es, reemplazame, aquellos strings donde haya especificamente 20 caracteres que NO sean un número seguido de 21 o 22 caracteres que no sean mayúsculas... Supongo que ya puedes ver el fallo.


Aquí no tienes que buscar reemplazar (sanitizar), tienes que validar. Es decir, no buscas un replace, buscas que el valor sea especificamente el formato que le estas indicando (test). Por tanto, verifica que de principio (^) a fin ($), el texto contiene exactamente 20 caracteres numéricos y 2 letras mayúsculas. O lo que es lo mismo:


Código
  1. const tests = [
  2.  '1234567890AB',
  3.  '1234567890AB1234567890',
  4.  '12345678901234567890AABB',
  5.  '123456789012345678901A',
  6.  '1234567890123456789AB2',
  7.  '$$$$$$$$$$$$$$$$$$$$00',
  8.  'dsakdsakldjaksljdklasa',
  9.  'askjdasdjklasjdkasjd12',
  10.  '12345678901234567890AB',
  11. ];
  12.  
  13. const regexCode = /[0-9]{20}[A-Z]{2}$/g;
  14.  
  15. tests.forEach(function(value) {
  16.  
  17.  if (!regexCode.test(value)) {
  18.    console.log(value + ' no es un codigo valido');
  19.  }
  20.  
  21. });

El único que no te saltara como no valido es el ultimo (12345678901234567890AB) puesto que cumple con las condiciones.

Saludos

La expresión regular funciona perfecto! pero no en el contexto que la quiero aplicar, ya que estoy intentando que sea lo opuesto digamos...

Código
  1. form_verify_email.verify_code.value = String(form_verify_email.verify_code.value).replace(/[0-9]{20}[A-Z]{2}/g, '');
  2.  

ya que si encuentra problemas va a borrar eso del input con .replace

intente estos:
Código
  1. form_verify_email.verify_code.value = String(form_verify_email.verify_code.value).replace(/^[0-9]{20}[A-Z]{2}/g, '');
  2.  

Código
  1. form_verify_email.verify_code.value = String(form_verify_email.verify_code.value).replace(/[^0-9]{20}[^A-Z]{2}/g, '');
  2.  

Pero ninguno me está funcionando, (está útil esa pagina que me habías pasado)

EDIT: no soy experto pero creo que a el segundo intento le falta un OR o || pero en expresión regular creo yo jeje, voy a revisar...
EDIT X2: mmm no no tuve suerte
« Última modificación: 3 Octubre 2019, 02:33 am por MiguelCanellas » En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: [Pregunta]: Problema con expresión regular
« Respuesta #3 en: 3 Octubre 2019, 02:36 am »

Citar
ya que estoy intentando que sea lo opuesto digamos...

Ya, por eso te he dicho que deberias validar y no sanitizar en este caso. Si, puedes hacer una regex que busque solo esa coincidencia y quite el resto:

Código
  1. form_verify_email.verify_code.value = String(form_verify_email.verify_code.value).replace(/.*([0-9]{20}[A-Z]{2}).*/g, '$1');

Y esto solo te cogeria lo que buscas.. pero es que lo cogerá de cualquier lado, aunque el string sea este:

Código:
sad123456789012345das67890AA1234567890123dasdasd45678
90AA12345678901234567890AA12345678901234567890AA123456789
01234567890AA12345678901234567890AA12345678901234567890AA
12345678901234567890AA12345678901234567890AA123456789sadsa
dsa01d45678901234567890dasdAA12345678901234567890AA1234567
890124567890AA12345678901234567890AA12345678901234567890AA
12345678901234567asdas890AA12345678901234567890AA1234567890
1234567890AA12345678901234567890AA12345678901234567890AA123
45678901234567890AA12345678901234567890AAASDASDASDSADSA123
45678901234567890AA12345678901234567890AA

y así te estás exponiendo a que generen un string gigante que casualmente podría contener un código válido y alá, a correr.


Intenta validar antes de sanitizar. Comprueba si el string que te están pasando cumple con el formato que pides, si no lo hace, mandales a fregar, pero no intentes hacerle el favor a un posible atacante.


Saludos
« Última modificación: 3 Octubre 2019, 02:40 am por #!drvy » En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: Problema con expresión regular
« Respuesta #4 en: 3 Octubre 2019, 03:04 am »

Ya, por eso te he dicho que deberias validar y no sanitizar en este caso. Si, puedes hacer una regex que busque solo esa coincidencia y quite el resto:

Código
  1. form_verify_email.verify_code.value = String(form_verify_email.verify_code.value).replace(/.*([0-9]{20}[A-Z]{2}).*/g, '$1');

Y esto solo te cogeria lo que buscas.. pero es que lo cogerá de cualquier lado, aunque el string sea este:

Código:
sad123456789012345das67890AA1234567890123dasdasd45678
90AA12345678901234567890AA12345678901234567890AA123456789
01234567890AA12345678901234567890AA12345678901234567890AA
12345678901234567890AA12345678901234567890AA123456789sadsa
dsa01d45678901234567890dasdAA12345678901234567890AA1234567
890124567890AA12345678901234567890AA12345678901234567890AA
12345678901234567asdas890AA12345678901234567890AA1234567890
1234567890AA12345678901234567890AA12345678901234567890AA123
45678901234567890AA12345678901234567890AAASDASDASDSADSA123
45678901234567890AA12345678901234567890AA

y así te estás exponiendo a que generen un string gigante que casualmente podría contener un código válido y alá, a correr.


Intenta validar antes de sanitizar. Comprueba si el string que te están pasando cumple con el formato que pides, si no lo hace, mandales a fregar, pero no intentes hacerle el favor a un posible atacante.


Saludos

Si igual es más que nada para mejorar un poquito la "experiencia del usuario" ya que esto lo valido con otras técnicas en PHP no necesariamente con expresiones regulares, con poner maxlength = 22 en dicho input no hay problema (ya se que esto lo pueden editar en inspeccionar elemento) a lo que voy es que no me interesa tanto como quede esto en temas de seguridad...

No se si soy muy duro o no entiendo o que, pero tampoco el código este me sirvió.
Según lo que pude entender es que este código debería funcionar pero como dijiste arriba si me ponen cadenas muy largas habrá problemas (pero igual no hay problema para mi que esto pase)
Código
  1. form_verify_email.verify_code.value = String(form_verify_email.verify_code.value).replace(/.*([0-9]{20}[A-Z]{2}).*/g, '$1');
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Expresión regular « 1 2 3 »
PHP
IWKY 29 20,655 Último mensaje 25 Enero 2010, 23:57 pm
por ~ Yoya ~
Problema con expresión regular
PHP
egyware 7 5,990 Último mensaje 12 Febrero 2010, 00:32 am
por ~ Yoya ~
Problema con expresión regular PCRE
PHP
samur88 2 2,157 Último mensaje 8 Febrero 2012, 17:34 pm
por samur88
Problema con expresión regular en PHP
PHP
Yaldabaot 1 2,610 Último mensaje 22 Julio 2016, 13:33 pm
por Adrialmend
[Pregunta]: Expresión regular para formato serial "12345-ABCDE-12345"
Desarrollo Web
Leguim 3 5,134 Último mensaje 24 Junio 2022, 04:35 am
por l337*
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines