Foros del Web » Programando para Internet » PHP »

Buscar emails en texto

Estas en el tema de Buscar emails en texto en el foro de PHP en Foros del Web. Hola foreros Llevo tiempo dándole vueltas a un problema de optimización que tengo en mi base de datos, que no es que me inhabilite ninguna ...
  #1 (permalink)  
Antiguo 11/12/2015, 02:22
 
Fecha de Ingreso: mayo-2006
Mensajes: 71
Antigüedad: 18 años
Puntos: 0
Buscar emails en texto

Hola foreros

Llevo tiempo dándole vueltas a un problema de optimización que tengo en mi base de datos, que no es que me inhabilite ninguna función de mis códigos pero que ademas de solucionarme este problema la solución me sirva para otras funciones que tengo en mente.

Y es que tengo una base de datos de unos 2500 emails recogidos de la antigua base de datos de mi web, he pasado todos esas direcciones a mi nueva base de datos para retomar el envío de newsletter a mis clientes hasta ai todo bien.

Pero la duda que me surge es que al tener unas 500 direcciones las cuales su servidor me responde que la dirección no existe o esta borrada, me gustaría eliminar para así optimizar mi base de datos.

Lo que utilizo son las funciones IMAP de php para listar todos los correos recibidos para así con foreach ir detectando las direcciones de correo que hay en cada correo.

De momento mi problema esta con la expresión regular de la función preg_match_all, esta función la he utilizado otras veces para detectar etiquetas <IMG> en correos y la verdad que me ha ido bien. Para probar estoy utilizando este código el cual pretendo que me devuelva un array con las direcciones de correos encontradas.


Código PHP:
<?

$texto
="[email protected] es un correo de carlos. [email protected] también.";


preg_match_all("(^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$)"$texto$coincidenciasPREG_SET_ORDER);


print_r($coincidencias);

?>
Y no me devuelve absolutamente nada. Alguna modificación de la expresión regular me a devuelto la cadena entera o la cadena a partir de un carácter.

Gracias de antemano foreros
  #2 (permalink)  
Antiguo 15/12/2015, 06:38
 
Fecha de Ingreso: mayo-2006
Mensajes: 71
Antigüedad: 18 años
Puntos: 0
Respuesta: Buscar emails en texto

Quiero dejar claro que no tengo ninguna intención en utilizar esta solución para captar direcciones de correos electrónicos en paginas de Internet de terceros utilizando arañas o técnicas parecidas.

Repito que quiero buscar direcciones de correos en las repuestas fallidas de tipo "Mail delivery failed: returning message to sender" para posteriormente eliminarlas de la base de datos para optimizar.
  #3 (permalink)  
Antiguo 15/12/2015, 10:42
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 2 meses
Puntos: 1146
Respuesta: Buscar emails en texto

el simbolo ^ hace que la coincidencia siempre tenga que empezar al inicio del string por lo que si tienes algo mas antes del correo jamas coincidira.

Aparte preg_match_all requiere que la expresion este envuelta en / o |

Yo para validar correos utilizo

[a-zA-Z] -> al inicio para asegurarme empieze con una letra
[a-zA-Z0-9\._-] -> para tomar todos los caracteres validos
@
[a-zA-Z0-9\._-] -> para extraer el dominio, tambien con caracteres validos
[a-z]{2,5} -> para conocer la extencion de dominio,,, eso de limitarlo a 3 caracteres ya no es valido ya que hay dominios mas largos como .ninja .agency .express entre muchos otros de nueva aparicion.

[a-zA-Z][a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-z]{2,5}



Código PHP:
Ver original
  1. preg_match_all("|[a-zA-Z][a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-z]{2,5}|", $texto, $coincidencias);
  2.  
  3. preg_match_all("/[a-zA-Z][a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-z]{2,5}/", $texto, $coincidencias);

Última edición por ArturoGallegos; 15/12/2015 a las 10:48

Etiquetas: emails
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:10.