https://foro.gambas-es.org/viewtopic.php?f=5&t=1002
-----------------------------------
TrueneX
Viernes, 08 Octobre 2010, 16:44

Extraer emails de un texto [SOLUCIONADO]
-----------------------------------
Buenas, estoy haciendo una aplicacion para extraer mails... pero tengo un problemin,  a la hora de revisar en un texto en busca de emails no encuentro una funcion que devuelva el valor string (el email)  sino que todas devuelven boolean (InStr,LIKE,Etc) es decir (True/1 o False/0) no si alguien ya estubo mirando com ohacerlo o alguein tiene una idea de como lograr esto? la idea es obtenerlo en una variable (no en un archivo) ya que luego con un bucle voy lsitando todos los correos de ese texto...   si me explique mal por favor avisen y explico mejor  si puedo :)

Saludos


-----------------------------------
jsbsan
Viernes, 08 Octobre 2010, 18:04

Re: [Consulta]Verificar Texto / Retorno De String Y No Boolean
-----------------------------------
Echale un vistazo a esta documentacion de la orden [url=http://gambasdoc.org/help/lang/mid?es]Mid$

Yo lo haria de la siguiente manera:
Buscaría todas las @ que tengas el texto, (con un bucle For.... Next) y vas examinando cada caracter de la cadena y si es igual a @ guardas la posición que este  en un array.

Luego para cada posición que hayas encontrado tendras que buscar las direcciones:
Seguramente los correos estarán separados por algún caracter "(" ,")", "<",">" o espacios
Con cada  posición que te ha dado las busqueda (@), buscar hacia la derecha el caracter ")" , ">" o espacio
y hacia la izquierda "(" , "<", o espacio. 

Tendras ya la posicion izquierda y posicion derecha de cada direccion, lo extraes con [b]Mid$[/b](texto_analizado,posicion_izquierda,posicion_derecha)

¿entiendes el procedimiento? 

Espero haberte ayudado. 

Saludos


-----------------------------------
TrueneX
Viernes, 08 Octobre 2010, 18:26

Re: [Consulta]Verificar Texto / Retorno De String Y No Boolean
-----------------------------------
si eso lo lei por ahi sacando las posiciones ...  pero como vi el proceso mas complicado queria ver si habia alguna fomra mas simple , pero en fin ... lo voy a probar a ver que onda , si alguien save algun otro ejemplo , bienvenido sea :)


Gracias man


Saludos


-----------------------------------
soplo
Viernes, 08 Octobre 2010, 19:17

Re: [Consulta]Verificar Texto / Retorno De String Y No Boolean
-----------------------------------
Hola

[quote]a la hora de revisar en un texto en busca de emails no encuentro una funcion que devuelva el valor string (el email)[/quote]

private function EstraerEmail(Texto as string) as string
Dim PartesEmail as string[], Partes as string[]
Dim Email as string

PartesEmail=split(Texto,"@")
'ahora en PartesEmail[0] tienes todo lo anterior a la @ es decir, basura y el usuario
'en PartesEmail[1] tienes el dominio y basura.

Para obtener el usuario hay que buscar la posición del último espacio. Todo lo que haya desde esa posición en adelante es el usuario.

Partes=split(PartesEmail[0]," ")
Con esto cojo la primera parte (donde está la basura y luego el usuario) y divido por espacios. El último item es el usuario

Email=Partes[Partes.max] & "@" 'con esto ya tengo el usuario y la arroba. Ahora obtener el dominio.

Para obtener el dominio divido la segunda parte por espacios y el primer item es el dominio
Partes=split(PartesEmail[1]," ")
Email &= Partes[0]

Osea, imagina un texto "hola que tal nombre@dominio.com y tal y tal"
Al dividir por @ obtengo (PartesEmail=split(texto,"@")
PartesEmail[0]="Hola que tal nombre"
PartesEmail[1]="dominio.com y tal y tal"

Ahora de PartesEmail[0] busco el último espacio y todo lo siguiente es el usuario. Lo mas fácil dividir por espacios y quedarme con el último item (partes=split(PartesEmail[0]," ") y obtengo:

Partes[0]="Hola"
Partes[1]="que"
Partes[2]="tal"
Partes[3]="nombre"
Me quedo con el último para sabe el usuario

El email ya será Partes[3] & "@

Para saber el dominio cojo PartesEmail[1] y lo primero es el dominio. Lo que hago es dividir por espacios Partes=split(PartesEmail[1]," "). Al hacerlo obtengo
Partes[0]="dominio.com"
Partes[1]="y"
Partes[2]="tal"
...

En definitiva la función es
[code linenumbers=false syntax=gambas]private function EstraerEmail(Texto as string) as string
Dim PartesEmail as string[], Partes as string[], Usuario as string, Dominio as string
Dim Email as string

PartesEmail=split(Texto,"@")
Partes=split(PartesEmail[0]," ")
Usuario=Partes[Partes.max] 

Partes=split(PartesEmail[1]," ")
Dominio=Partes[0]

Email=Usuario & "@" & Dominio
return Email
end[/code]

Y para usarla
[code linenumbers=false syntax=gambas]Email=ExtraerEmail(texto.text)[/code]

Esta función no considera el caso de que no haya ningún email. 

 :mryellow:


-----------------------------------
jsbsan
Viernes, 08 Octobre 2010, 21:15

Re: [Consulta]Verificar Texto / Retorno De String Y No Boolean
-----------------------------------
El codigo de Soplo esta muy bien, y lo he mejorado un poco.
- Detecta si no hay correos en el texto
- Y usa un array ( email[] ) por si el texto contiene más de un correo, haciendo que la función  ExtraerEmail  devuelva ese array o matriz.

Te paso el codigo, he creado un textArea (llamado TextAreaAnalizar), un Listbox (llamada ListBoxCorreos) y un boton (llamado ButtonBuscar)

Te adjunto el código:
[code linenumbers=false syntax=gambas]' Gambas class file
PUBLIC FUNCTION ExtraerEmail(Texto AS String) AS String[]
DIM PartesEmail AS NEW string[], Parteusuario AS NEW string[], partedominio AS NEW String[], Email AS NEW String[]
DIM a AS Integer

PartesEmail = Split(" " & Texto & " ", "@")

IF Len(partesemail[0]) = (Len(texto) + 2) THEN 
Message.Info("no hay direcciones de correo en el texto")
RETURN email
ENDIF

'redimensiona los arrays segun las partes obtenidas -1 
email.Resize(PartesEmail.count - 1)
parteusuario.resize(PartesEmail.count - 1)
partedominio.resize(partesemail.count - 1)

'busca las partes de usuario y dominio de cada @ encontrada
FOR a = 0 TO partesemail.count - 2 STEP 1
parteusuario[a] = Mid$(partesemail[a], RInStr(PartesEmail[a], " ") + 1, Len(partesemail[a]) - InStr(PartesEmail[a], " "))

partedominio[a] = Mid$(partesemail[a + 1], 1, InStr(PartesEmail[a + 1], " ") - 1)

email[a] = parteusuario[a] & "@" & partedominio[a]
NEXT 

'devuelve el array email[]
RETURN Email
END




PUBLIC SUB ButtonBuscar_Click()
DIM email AS NEW String[]
DIM a AS Integer
ListBoxCorreos.Clear()

Email = ExtraerEmail(TextAreaAnalizar.text)

FOR a = 0 TO email.Count - 1
ListBoxCorreos.Add(email[a])
NEXT 

END[/code]

y un pantallazo de como lo resuelve:
 [img]http://foro.gambas-es.org/files/images/6/pantallazo_1286568322_539525.png[/img]

Saludos


-----------------------------------
TrueneX
Viernes, 08 Octobre 2010, 22:53

Re: [Consulta]Verificar Texto / Retorno De String Y No Boolean
-----------------------------------
Joya gracias por la ayuda , tema resuelto :)

PD: y si los correos estan en por ejemplo un documendo .sql , los correos no van a estar separados por espacios... sino por comillas simples, dobles ,? ya cambiaria todo el code ... pero buen ome pogno a investigar


-----------------------------------
soplo
Sabado, 09 Octobre 2010, 02:10

Re: [Consulta]Verificar Texto / Retorno De String Y No Boolean [SOLUCIONADO]
-----------------------------------
Sugiero que el código de jsbsan se ponga como fragmentos de código en el foro correspondiente.

 :mryellow:


Ya que dices que no siempre el delimitador será el espacio para tus fines realizo un pequeño cambio en la función que puse (por simplificar, la de jsbsan está mejor) para que valga con cualquier delimitador que quieras usar.


[code linenumbers=false syntax=gambas]private function EstraerEmail(Texto as string, Optional Delimitador as string) as string
Dim PartesEmail as string[], Partes as string[], Usuario as string, Dominio as string
Dim Email as string

if not Delimitador then 
   Delimitador=" "
endif

PartesEmail=split(Texto,"@")
Partes=split(PartesEmail[0],Delimitador)
Usuario=Partes[Partes.max]

Partes=split(PartesEmail[1],Delimitador)
Dominio=Partes[0]

Email=Usuario & "@" & Dominio
return Email
end[/code]

Tal y como está ahora la función puedes opcionalmente incluir como parámetro el delimitador que quieres usar. Si no dices nada usa el espacio y hace lo mismo que antes. Si especificas uno entonces se usa ese.

Para usarlo
Email=ExtraerEmail(texto.text) 'esto busca email delimitado por espacios
Email=ExtraerEmail(Texto.text," ") 'esto también busca email delimitado por espacios
Email=ExtraerEmail(Texto.text,"'") esto busca email delimitados por comita
Email=ExtraerEmail(Texto.text,"""") esto busca email delimitados por doble comilla (creo que es así como se entrecomilla una comilla pero no estoy seguro).
Email=ExtraerEmail(Texto.text,"#") esto busca email delimitado por #

 :mryellow:


-----------------------------------
jsbsan
Sabado, 09 Octobre 2010, 12:35

Re: Extraer Emails De Un Texto [SOLUCIONADO]
-----------------------------------
Ok, Soplo,  le añado tu mejora de "delimitador", pero direfenciando dos delimitadores inicial y final, por si el correo esta asi: <direccion@hotmai.com> en vez de usar "direccion@hotmial.com", para ya hacerlo mas generalizado...

Ademas el tema de """" (doble comilla), creo que es mejor usar chr$(34), que te genera las "


[b]¡que bueno es el código libre!, todos aprendemos de todos y al final salen cosas muy útiles... :mryellow: [/b]

Quedaria asi:

[code linenumbers=false syntax=gambas]
' Gambas class file
PUBLIC FUNCTION ExtraerEmail(Texto AS String, OPTIONAL DelimitadorInicial AS String, OPTIONAL DelimitadorFinal AS String) AS String[]
'Para usarlo
'Email=ExtraerEmail(texto.text) 'esto busca email delimitado por espacios
'Email=ExtraerEmail(Texto.text," ") 'esto también busca email delimitado por espacios'
'Email=ExtraerEmail(Texto.text,"'") esto busca email delimitados por comita
'Email=ExtraerEmail(Texto.text,chr$(34)) esto busca email delimitados por doble comilla (creo que es así como se entrecomilla una comilla pero no estoy seguro).
'Email=ExtraerEmail(Texto.text,"#") esto busca email delimitado por #
'Email=ExtraerEmail(Texto.text,"<",">") esto busca email delimitado que este delimitado  al inicio por < y al final >

DIM PartesEmail AS NEW string[], Parteusuario AS NEW string[], partedominio AS NEW String[], Email AS NEW String[]
DIM a AS Integer

'comprobaciones de delimitadores
IF NOT Delimitadorinicial THEN
 Delimitadorinicial = " "
 delimitadorfinal = " "
ENDIF

IF NOT DelimitadorFinal THEN 
DelimitadorFinal = DelimitadorInicial
ENDIF 



PartesEmail = Split(DelimitadorInicial & Texto & DelimitadorFinal, "@")

IF Len(partesemail[0]) = (Len(texto) + 2) THEN
Message.Info("no hay direcciones de correo en el texto")
RETURN email
ENDIF

'redimensiona los arrays segun las partes obtenidas -1
email.Resize(PartesEmail.count - 1)
parteusuario.resize(PartesEmail.count - 1)
partedominio.resize(partesemail.count - 1)

'busca las partes de usuario y dominio de cada @ encontrada
FOR a = 0 TO partesemail.count - 2 STEP 1
parteusuario[a] = Mid$(partesemail[a], RInStr(PartesEmail[a], DelimitadorInicial) + 1, Len(partesemail[a]) - InStr(PartesEmail[a], DelimitadorInicial))

partedominio[a] = Mid$(partesemail[a + 1], 1, InStr(PartesEmail[a + 1], delimitadorfinal) - 1)

email[a] = parteusuario[a] & "@" & partedominio[a]
NEXT

'devuelve el array email[]
RETURN Email
END








PUBLIC SUB ButtonBuscar_Click()
DIM email AS NEW String[]
DIM a AS Integer
ListBoxCorreos.Clear()

Email = ExtraerEmail(TextAreaAnalizar.text, "<", ">")

FOR a = 0 TO email.Count - 1
ListBoxCorreos.Add(email[a])
NEXT 

END



[/code]


Saludos


