regex para email catastrophic backtracking

Iniciado por gAb1, 19 Abril 2016, 06:24 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Estoy creando mi propio regex para validar emails pero no consigo hacer funcionar el límite de carácteres de los dos primeros grupos, el tercer grupo si que valida bien el máximo.

Código (php) [Seleccionar]
/^([\w]+(?:[\.\-][\w]+)*){1,64}@([\w]+(?:[\.\-][\w]+)*){1,64}\.([a-zA-Z]{2,7})$/

Si no me equivoco el error quiere decir que está mal optimizado y le da carga innecesaria al procesador, no?

Como se puede leer, lo que busco es que los guiones actuen de la misma manera que los puntos, que no se puedan poner delante ni detras, solo entre dos caracteres \w. Tanto para el nombre de usuario como para el nombre de dominio.

Gracias!

ivancea96

{1,64} no es un límite de caracteres. Es la cantidad de veces que se puede repetir lo que tiene detrás. Como detrás tienes:
([\w]+(?:[\.\-][\w]+)*)
Eso se va a repetir hasta 64 veces. Como tienes un *, no va a tener límite máximo.

gAb1

Aaah vale, ya decia yo que algo parecia extraño. Entonces un límite de carácteres válido sería ponerlo delante de una clase de caráctares, no en un grupo nesteado que no tiene límite.

Código (php) [Seleccionar]
/^([\w\s]{4,10})$/

Para casos de grupos nesteados ¿es mejor usar la función php strlen()? o ¿hay alguna manera eficiente de hacer esto dentro del regex?

De todas maneras parece que si uso strlen() le doy más flexibilidad al usuario con el limite de carácteres. 100 carácteres maximos para un email está bien, ¿no?

ivancea96

Ahí ya, tú verás. Sin embargo, lo ideal sería una validación completa por parte de regex.

Te serviría algo como:
Código (regex) [Seleccionar]
/[0-9a-zA-Z](?:[0-9a-zA-Z\.\-]{0,62}[0-9a-zA-Z])?/

Claro que ahí permitiría varios puntos seguidos.
Un validador que mida la cadena exacta sin duda es algo difícil. Tu método, validando luego con otro lenguaje, pienso que es perfecto para no complicarse la vida xD

gAb1

Si, y se te olvidaron las _ xD (un email sin _?  ;D)

Parece que lo mejor es strlen(), 100 para todo, más flexibilidad.