Validacion con Expresion Regular

644 views
Skip to first unread message

Xavier Romero

unread,
Mar 4, 2013, 4:53:11 PM3/4/13
to php...@googlegroups.com
Hola amigos me podrian ayudar con una validacion sobre un campo con expresiones regulares para que me valide si ese campo tenga al menos una letra y al menos y numero en definitiba que ese campo registre un cadena alfanumerica


Saludos. 

Xavier

Tordek

unread,
Mar 4, 2013, 5:44:22 PM3/4/13
to php...@googlegroups.com
preg_match("/([0-9].*[a-z]|[a-z].*[0-9])/", $foo);

Pero dificilmente sea lo que necesitás. Si por "alfanumérico"
significa que tiene letras o números, aunque no necesariamente los dos:

preg_match("/[a-z0-9]/", $foo);

pero eso matchea cosas que quizá no quieras, como "こんにちはa8" (la
primera, también).

¿A lo mejor tu validación es para nombres de usuario, y querés que
sean caracteres legibles?

preg_match("/^[a-z0-9]$/"$foo);

¿O lo que buscás es para passwords? En cuyo caso te recomiendo que
pienses en una solución mejor que las regexes, porque te agregan
muchas más complejidades que las que querés.

Si nos contás el problema con más detalle, te podemos dar una
solución apropiada :).

>
>
> Saludos.
>
> Xavier
--
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek

Xavier Romero

unread,
Mar 4, 2013, 5:58:11 PM3/4/13
to php...@googlegroups.com
Hola gracias por responder si quiero validar una campo de clave para que el usuario ingrese obligatoriamente letras y numeros en su clave y que no ingrese numeros o letras solamente
asi le obligo a ingresar letras y numeros en su clave

Saludos.


--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a php-arg+unsubscribe@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/php-arg?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



Tordek

unread,
Mar 4, 2013, 6:10:38 PM3/4/13
to php...@googlegroups.com
On 04/03/13 19:58, Xavier Romero wrote:
> Hola gracias por responder si quiero validar una campo de clave para
> que el usuario ingrese obligatoriamente letras y numeros en su clave
> y que no ingrese numeros o letras solamente
> asi le obligo a ingresar letras y numeros en su clave

Yo soy de los que prefieren que los sitios no les rompan las
pelotas, y que si quiero poner una clave totalmente débil, que me
dejen... pero si eso es lo que querés, tenés... varias opciones:

1) Una regex que haga todo (aceptable en este caso, pero te agrega
muchísima complejidad modificarla más adelante):

preg_match("/([0-9].*[a-zA-Z]|[A-Za-z].*[0-9])/", $foo);

2) Revisar todos los componentes en serie (Esto te da la ventaja de
que podés decirle al usuario: "La clave debe tener números y letras,
[tu clave no tiene letras], [tu clave no tiene números], [tu clave
debe tener al menos 6 caracteres]"):

preg_match("/[0-9]/", $foo) // tiene numeros
preg_match("/[a-zA-Z]/", $foo) // tiene letras
strlen($foo) >= 6 // longitud mínima

3) Lo mismo que 3, pero "a mano" en vez de con regex (con la excusa
de velocidad, pero tomando el cuenta los string que comparás,
rarmente sea importante).

OFF-TOPIC:

Y, por supuesto, tenés otros factores: acá le estás exigiendo
seguridad al usuario, pero, ¿vos proveés seguridad correctamente?
(Es decir: ¿hasheas el password con salt única usando una función
diseñada para hashear passwords? o, idealmente, ¿usás phpass?)
>
> Saludos.

Camello Ar

unread,
Mar 4, 2013, 6:28:49 PM3/4/13
to php...@googlegroups.com
Asimismo necesita un regex para excluir ciertos caracteres  salvo que la clave pueda contener cualquier carácter


Tordek

unread,
Mar 4, 2013, 7:26:30 PM3/4/13
to php...@googlegroups.com
On 04/03/13 20:28, Camello Ar wrote:
> Asimismo necesita un regex para excluir ciertos caracteres salvo
> que la clave pueda contener cualquier car�cter

�Hay alg�n caracter que quieras excluir de un password? �por qu�?
�seguro? �te das cuenta que las listas negras no sirven?

TL;DR: No (a menos que le tengas miedo a unicode).


--

pablof...@gmail.com

unread,
Mar 4, 2013, 8:41:40 PM3/4/13
to php...@googlegroups.com
aca tenes una web para sacar muchas regex http://pregcopy.com/


Tambien tenes la wikipedia para aprender un poco



----------------------------------------
Pablo Morales
blog: http://blog.pablo-morales.com
linkedln: http://www.linkedin.com/pub/9/528/21
skype: pablofmorales


2013/3/4 Tordek <ked...@gmail.com>
On 04/03/13 20:28, Camello Ar wrote:
Asimismo necesita un regex para excluir ciertos caracteres  salvo
que la clave pueda contener cualquier carácter

¿Hay algún caracter que quieras excluir de un password? ¿por qué? ¿seguro? ¿te das cuenta que las listas negras no sirven?


TL;DR: No (a menos que le tengas miedo a unicode).


--
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek

Xavier Romero

unread,
Mar 5, 2013, 5:11:14 PM3/5/13
to php...@googlegroups.com
Hola a todos gracias me han ayudado mucho pero como hago para que esas validaciones no me permitan ingresar caracteres especiales como @ $% etc.. como haria en este caso ?

Saludos


Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a php-arg+u...@googlegroups.com.

Tordek

unread,
Mar 5, 2013, 5:22:04 PM3/5/13
to php...@googlegroups.com
On 05/03/13 19:11, Xavier Romero wrote:
> Hola a todos gracias me han ayudado mucho pero como hago para que
> esas validaciones no me permitan ingresar caracteres especiales como
> @ $% etc.. como haria en este caso ?

Obviamente que a una consulta como esta le tengo que preguntar:
�PARA QU�?

Primero al usuario le exig�s que use n�meros y letras. Suponemos,
entonces, que quer�s forzar al usuario a que tenga seguridad... pero
ahora ven�s a quitarle caracteres al usuario. ESTO LE QUITA
SEGURIDAD. NO LE QUITES OPCIONES AL USUARIO, NO TE IMPORTA LO QUE
HAGA CON SU PASSWORD, TOTAL VOS NO LO SABES.

Pero, esto sirve perfectamente para ilustrar por qu� usar regex es
p�simo para este tipo de validaciones.

Si usaras una sola regex, ser�a esto:

/^([a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*[0-9][a-zA-Z0-9]*|[a-zA-Z0-9]*[0-9][a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*)$/

Si usaras la otra opci�n que te mencion�, de varias regex, termin�s con:

// regex de si tiene n�meros
// regex de si tiene letras

/^[a-zA-Z0-9]+$/

Pero esto puede que no sea exactamente lo que quer�s; si lo que
quer�s es una lista negra de caracteres, ser�:

/[@$%]/ // y, obviamente, negar el resultado de este matcheo, porque
quer�s que en el string haya 0 de esos caracteres.

A pesar de todo eso, te vuelvo a repetir: NO HAGAS ESTO. NO LO USES.
PENS� EN POR QU� LO EST�S HACIENDO Y DATE CUENTA QUE EST� MAL. NO
LIMITES LOS CARACTERES DEL PASSWORD.

Como prevenci�n: si esto es "para que el user no pueda hacer
inyeccion SQL", proveeme inmediatamente una lista de los sitios que
manej�s as� nunca pongo un password ah�.


> Saludos

Adrian Ramiro

unread,
Mar 6, 2013, 12:25:52 AM3/6/13
to php...@googlegroups.com
"proveeme inmediatamente una lista de los sitios que manejás así nunca pongo un password ahí."

Jaja!, voy a enmarcar esa frase.

Perdon el Off Topic


2013/3/5 Tordek <ked...@gmail.com>
On 05/03/13 19:11, Xavier Romero wrote:
Hola a todos gracias me han ayudado mucho pero como hago para que
esas validaciones no me permitan ingresar caracteres especiales como
@ $% etc.. como haria en este caso ?

Obviamente que a una consulta como esta le tengo que preguntar: ¿PARA QUÉ?

Primero al usuario le exigís que use números y letras. Suponemos, entonces, que querés forzar al usuario a que tenga seguridad... pero ahora venís a quitarle caracteres al usuario. ESTO LE QUITA SEGURIDAD. NO LE QUITES OPCIONES AL USUARIO, NO TE IMPORTA LO QUE HAGA CON SU PASSWORD, TOTAL VOS NO LO SABES.

Pero, esto sirve perfectamente para ilustrar por qué usar regex es pésimo para este tipo de validaciones.

Si usaras una sola regex, sería esto:


/^([a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*[0-9][a-zA-Z0-9]*|[a-zA-Z0-9]*[0-9][a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*)$/

Si usaras la otra opción que te mencioné, de varias regex, terminás con:

// regex de si tiene números

// regex de si tiene letras

/^[a-zA-Z0-9]+$/

Pero esto puede que no sea exactamente lo que querés; si lo que querés es una lista negra de caracteres, será:

/[@$%]/ // y, obviamente, negar el resultado de este matcheo, porque querés que en el string haya 0 de esos caracteres.

A pesar de todo eso, te vuelvo a repetir: NO HAGAS ESTO. NO LO USES. PENSÁ EN POR QUÉ LO ESTÁS HACIENDO Y DATE CUENTA QUE ESTÁ MAL. NO LIMITES LOS CARACTERES DEL PASSWORD.

Como prevención: si esto es "para que el user no pueda hacer inyeccion SQL", proveeme inmediatamente una lista de los sitios que manejás así nunca pongo un password ahí.


Saludos

--
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a php-arg+unsubscribe@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/php-arg?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.





--
/**
* @author: Adrian R. Gay Cattaneo
*/
Reply all
Reply to author
Forward
0 new messages