FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Validando una dirección de correo-e
Una función para comprobar una dirección de correo electrónico ingresada, de manera muy estricta. Funciones de este tipo hay varias, esta de la más completa que encontré. Leer código bien escrito es un placer, y Object Pascal lo hace más agradable aún.
Fuente: http://www.howtodothings.com/compute...in-delphi.html
__________________
Lazarus Codetyphon : Desarrollo de aplicaciones Object Pascal, libre y multiplataforma. |
#2
|
||||
|
||||
¿Esta es aún mejor que las que hay utilizando Expresiones Regulares?, si es así... ¿Cuál sería la razón?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
#3
|
|||
|
|||
No veo por qué esa función sería mejor que una buena expresión regular. Me parece que lo complicas demasiado para nada.
|
#4
|
||||
|
||||
El codigo aqui es una maquina de estado. Una expresion regular eso es lo que genera (en formato DFA), aunque existe una mejor manera si no hay necesidad de backtraking:
https://swtch.com/~rsc/regexp/regexp1.html Osea: Es codigo especifico hecho a mnos, presumiblemente (porque faltaria chequearlo) mas eficiente que el generado a maquina... y ademas no tienen dependencias...
__________________
El malabarista. |
#5
|
|||
|
|||
NO, que NO y que NO!
Definitivamente como hay otros compañeros que han objetado, hay maneras mucho mas sencillas para validar un correo electronico, y en cuanto a validación se refiere RegEX (Expresión Regular) es la mejor solución/opción al caso.
Con muy poco esfuerzo podremos tener un verificador de Correos Electronicos en unos pocos minutos. Requerimientos: Código:
Libreria: TPerlRegEx Código:
(x1) Edit = edt1 (x1) Botón = btn1 (x1) Label = lbl1 Código:
var parser: TPerlRegEx; list: TStringList; found: boolean; str: string; i: Integer; strToMatch: string; Código:
try list := TStringList.Create; try parser := TPerlRegEx.Create; try parser.RegEx := '(^[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}$)'; strToMatch := edt1.Text; parser.Subject := strToMatch; found := parser.Match; if found = True then begin lbl1.Caption := 'VALIDO!'; end else begin lbl1.Caption := 'INVALIDO!'; end; finally parser.Free; end; finally list.Free; end; except on E: Exception do Application.MessageBox(PChar(E.Message),'Verificador de Correos Electronicos', MB_OK); end; Cabe mencionar que la Expresión Regular que se utiliza en este caso, identifica y reconoce el 99.99% de los Correos Electronicos! |
#6
|
||||
|
||||
Muy útil para mi que manejo aún el Delphi 5 y en este IDE no tenemos expresiones regulares.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
#7
|
||||
|
||||
Cita:
Es una propuesta de tantas. Si se tratara de un error conceptual bueno, te acepto la corrección, pero no es el caso. Es una alternativa y propuesta PERSONAL a considerar y como tal no puede ser descartada. Sobre todo si quien pretende descartarla es un usuario que apenas lleva 2 mensajitos y viene prepotente. Acá suficiente tiene el foro con ciertos usuarios prepotentes , entre ellos me incluyo ¿está claro? De que usando expresiones regulares se puede, se puede. Haciéndolo por una máquina de estados, TAMBIÉN se puede. ¿Cuál de las dos es más eficiente? Para sacarnos las dudas concretamente se debería hacer una prueba de perfomance. Ahora, lo que si me animo a decir que lapropuesta basada en la máquina de estados va a los bifes... directo a la problemática. Cuando uno usa expresiones regulares, indirectamente está generando una máquina de estados. De hecho, cuando se crea/carga la expresión regular el componente/clase va a necesitar primero armar la máquina de estados y luego procede a analizar la cadena a ver si la cumple. En última ambos procesos son equivalentes, pero la primera opción es mucho más directa. No descarten que es posible que les sace algunos ciclos de procesador de ventaja a la propuesta de expresiones regulares. Saludos, |
#8
|
||||
|
||||
Cita:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal Última edición por roman fecha: 24-11-2016 a las 18:31:36. Razón: Corregir la etiqueta [quote] ¡Novatos! :D |
#9
|
||||
|
||||
Podrá ser más directo pero también es reinventar la rueda. Yo prefiero la expresión regular a lidiar yo mismo con la máquina de estados.
pd: No hay punto en la guía de estilo que dicte un mínimo de mensajes para poder opinar LineComment Saludos |
#10
|
||||
|
||||
Ya que esto está por caer al caldero de los debates, pienso que sería interesante conocer un caso real de programación en Delphi donde habiendo la necesidad de validar direcciones de correo electrónico, y teniéndose al alcance el tipo nativo TRegEx de las versiones modernas, se haya optado por otro mecanismo en aras de un consumo óptimo de recursos (tiempo o memoria), con la respectiva explicación de qué diferencia de consumo de recursos se obtuvo en las pruebas y cómo sin esa optimización el proceso implementado se veía seriamente comprometido.
Ojo: No digo que no exista el caso. Última edición por Al González fecha: 24-11-2016 a las 21:15:03. Razón: Corregir expresión |
#11
|
||||
|
||||
Pero con tantas especificaciones parecería que sí.
Pd: por cierto Al, la expresión "más óptimo" no es correcta LineComment Saludos |
#12
|
||||
|
||||
¿A partir de qué versión existe regex?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#13
|
||||
|
||||
Olvidé comentar en el mensaje #9 -y es que nunca había visto este hilo- que independientemente de cuál técnica sea mejor, el ejemplo de rretamar luce bonito para entender un poco lo qué es una máquina de estado y cómo se implementa.
LineComment Saludos |
#14
|
||||
|
||||
Creo que a partir del las XE. Pero hay bibliotecas para versiones anteriores.
LineComment Saludos |
#15
|
||||
|
||||
Cierto, expresión corregida.
Cita:
Rescatado el hilo, no hervirá por ahora. |
#16
|
||||
|
||||
Pues yo prefiero el código en Pascal a las expresiones regulares. Principalmente porque me he leído chorrocientosmil artículos, tutoriales y cursos que prometían enseñar fácilmente cómo funcionan, y sigo sin tener ni pajolera idea, porque siempre que he creído entenderlo he intentado crear una y jamás lo he conseguido. Como mucho, he conseguido hacer algún cambio (pequeño) a alguna expresión regular pre-existente, pero nada más.
Además, es código escrito por Ernesto D'Spirito y eso ya me vale. ¡Anda que no he aprendido cosas gracias al trabajo de ese hombre! |
#17
|
||||
|
||||
Cita:
Código:
parser.RegEx := '(^[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}$)'; Cita:
Cita:
Cita:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#18
|
||||
|
||||
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 Código:
/^[A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3}$/i 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} 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} Código:
La arroba @ [A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3} 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} Código:
Igual que en 2. [A-Z0-9_-]+(.[A-Z0-9_-]+)*@[A-Z0-9_-]+(.[A-Z0-9_-]+)*.[A-Z]{2,3} 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} 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:
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 |
#19
|
||||
|
||||
Román: ¡Eso amerita like, tweet, picarle al botón reputación, puntos adicionales de poder y una Montejo! (O la cerveza que usted prefiera).
Gracias por el esmerado aporte. |
#20
|
||||
|
||||
Con la cerveza me basta Victoria, por favor
LineComment Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Error: too much mail from (dirección ip) enviando correo masivo | Gregorio Cíber | Internet | 2 | 10-07-2015 14:43:48 |
Como Saber si una Dirección de Correo es Válida???? | AGAG4 | Internet | 30 | 19-07-2011 19:36:48 |
Pueden Ver Mi Direccion De Correo? | CITHALI ACERMA | Seguridad | 12 | 18-06-2006 23:49:15 |
El correo que mando a una direccion de hotmail no llega bien | URBANO | Internet | 1 | 27-04-2005 08:53:49 |
Ejecutar cliente de correo pasandole la direccion del destinatario | Durbed | API de Windows | 1 | 19-10-2004 13:34:00 |
|