Como identificar una dirección email dentro de un archivo de texto
Ejemplo práctico del uso de las funciones de expresiones regulares
Las funciones para el análisis de cadenas con expresiones regulares, son una de las herramientas más poderosas que nos ofrecen los lenguajes de programación. Con ellas podemos hacer que nuestros programas aparenten tener un cierto nivel de "inteligencia" que de otro modo podría ser algo complejo de implementar.
En este ejemplo, podemos ver como con escasas 10 líneas, la funcion MAILS() nos identifica y devuelve todas las ocurrencias de expresiones tipo e-mail que contiene una cadena.
Es facil darse cuenta de todo el trabajo que esto nos ahorra, ya que implementar esto solamente con las funciones de manejo de cadenas básicas, sería un proyecto bastante más complicado.
Como funciona
Este programita, lo deberemos poner en algun servidor y junto a él un archivo llamado x.txt, el cual contendrá un texto (que puede ser muy largo) y el programa tratará de encontrar todas las direcciones de correo electrónico que existan en x.txt y las mostrará en pantalla.
Código fuente completo
<html> <body>
<?php
/* MAILS nos imprime en pantalla todas las ocurrencias del tipo cadena@servidor que encuentra dentro de la cadena $cad que recibe como parámetro */ function MAILS($cad) { $i=0; while($tld = ereg("[a-zA-Z0-9]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+", $cad, $regs)) { $cad=str_replace($regs[0],'**',$cad); echo $regs[0]."<br/>"; $i++; if($i>100) die('***** DESBORDAMIENTO ******<br/>'); //<- validación } }
/* El archivo x.txt tiene que existir y ahi es donde se buscarán las direcciones de email. Se trata de un archivo de texto comun y corriente */ $archivo='x.txt';
$fh = fopen($archivo, 'r') or die("Can't open file"); $ii=0; while(!feof($fh)) { $bufer = fgets($fh, 4096); MAILS($bufer); $ii++; if($ii>10000) {die('**** DESBORDAMIENTO ****<br/>');} //<- validación } fclose($fh);
echo "<hr> FIN"; ?>
</body> </html> |
Explicación del código:
La línea:
ereg("[a-zA-Z0-9]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+", $cad, $regs) |
es la clave de todo el proceso, la funcion ereg ejecuta la operación de buscar un patron (primer parámetro) dentro de una cadena (segundo parámetro, es decir $cad) y nos coloca el resultado de la busqueda dentro del array $regs (tercer parámetro) este array será el resultado. De este resultado, nos interesa solo el primer valor ($regs[0]) que contiene la cadena completa encontrada.
si desglosamos el patron, sería más o menos asi:
elemento | Significado |
[a-zA-Z0-9] | Debe tener una letra minuscula o mayúscula o un numero |
+ | Lo anterior debe repetirse una o más veces |
@ | Luego tiene que tener una arroba |
[a-zA-Z0-9_-] | Nuevamente una letra o número o guión bajo o guión medio |
+ | Lo anterior debe repetirse una o más veces |
(\.[a-zA-Z0-9_-]+) | Todo el paréntesis indica la busqueda de un punto seguido de más letras y/o números una o más veces |
+ | Lo anterior (todo el paréntesis) debe repetirse una o más veces |
Los demas valores de array pueden ser tambien de mucha utilidad, ya que contienen las diferentes partes del patrón según las va identificando a través de los paréntesis del mismo.
La funcion ereg nos devuelve un valor booleano de VERDADERO cuando encontró una ocurrencia del patrón y FALSO cuando no lo encontró, lo cual nos permite ponerlo dentro de un ciclo y de este modo encontrar todas las cadenas que coincidan.
la linea:
$cad=str_replace($regs[0],'**',$cad); |
Nos reemplaza el mail encontrado por un par de asteriscos '**', esto para asegurarnos de que en la siguiente vuelta del ciclo no nos encuentre la misma cadena.
Se puede mejorar
Nótese que no se incluyen emails que contengan puntos o guiones en el nombre antes de la arroba y suelen existir. La función fopen puede abrir igual una dirección tipo URL que un archivo, por lo que se puede dirigir a abrir una página Web y traernos todos los correos que ahí encuentre.
Este artículo fue echo solo con el objetivo del aprendizaje, por favor no hagan mal uso de este script
|