Ver Mensaje Individual
  #18  
Antiguo 25-11-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sí, no son fáciles, pero tampoco son imposibles. Para mi, una expresión regular es de sólo-escritura, las puedes escribir conforme las vas creando pero cuesta trabajo leerlas.

Yo, para validar emails uso esta:

Código:
/^[A-Z0-9_-]+(\.[A-Z0-9_-]+)*@[A-Z0-9_-]+(\.[A-Z0-9_-]+)*\.[A-Z]{2,3}$/i
Para irla entendiendo, omito las diagonales invertidas \ que sirven para escapar:

Código:
/^[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}$/i
Las diagonales / sólo delimitan la expresión y lo que va después es un modificador global, en este caso i que significa case insensitive. El caret ^ significa que debe coincidir con el principio de la cadena y el $ que debe coincidir con el final.

Luego vas separando las partes:

1.
Código:
Uno o más de los caracteres dentro de los corchetes
(letras, números, guiones bajos y medios):

[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}
2.
Código:
0 o más veces lo que está entre paréntesis
(un punto seguido de uno o más letras, números o guiones):

[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}
3.
Código:
La arroba @

[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}
4.
Código:
Uno o más de letras, números o guiones (como en 1.)

[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}
5.
Código:
Igual que en 2.

[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}
6.
Código:
Un punto seguido de 2 o tres letras:

[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}
En términos más humanos: si entendemos por un identificador válido cualquier cosa que tenga letras, números o guiones, éste lo representamos en la expresión regular por [A-Z0-9_-]+. Entonces, conceptualmente hablando, la expresión regular es:

Antes de la arroba: uno o más identificadores separados por puntos
Después de la arroba: uno o más identificadores separados por puntos y dos o tres letras separadas del resto por un punto (o sea, el .com, .org, .mx, etc.)

Y, de hecho, es de esta representación conceptual de donde parte uno y de ahí vas construyendo la expresión.

Lo que uno tiene que tener en cuenta es:
  1. Hay muchas formas de construir una expresión regular para un fin específico.
  2. Por tanto, nadie puede decir ÉSTA es la buena.
  3. No siempre es necesario abarcar todos y cada uno de los casos.

Por ejemplo, la expresión regular que uso, seguramente fallará en algunos casos, pero me ha funcionado sin problemas hasta ahora y a lo sumo tendré un usuario cada dos años que me diga: oye tu sistema no acepta mi correo. Nadie abarca todos los casos. Ni siquiera GMail (que es de donde basé mi expresión). Por ejemplo, ¿sabían que el RFC del email incluye comentarios ? Estoy seguro que nadie valida eso .

También es cierto que hay expresiones más complejas que incluye las referencias hacia atrás y hacia adelante pero las va uno entendiendo conforme escribes la expresión.

El manual de PHP explica muy claramente el uso de expresiones PCRE, que son las más comunes y puede aplicarse a otros ámbitos como Delphi.

LineComment Saludos
Responder Con Cita