2010-10-07 7 views
5

Si hay uno que podría manejar esto, ¿cuál sería el patrón correcto de extracción de direcciones de correo electrónico de una cadena que proviene de un correo electrónico de la línea "A", que permite que las direcciones estar delimitado por comas ",", punto y coma ";", espacios o cualquier combinación de los tres. La expresión regular también debe poder ignorar el texto de "ruido", por ejemplo, si una dirección está encerrada en "<" y ">" caracteres, o si tiene un nombre real al lado de la dirección de correo electrónico. Por ejemplo, de esta cadena que estaba en el campo Para:Regex para analizar Email Formulario "Para" campo

"Joe Smith" <[email protected]>, [email protected]; [email protected] [email protected] 

El patrón debe ser capaz de devolver los siguientes partidos de: jsmith @ ejemplo, [email protected], [email protected], mjane @ gmail.com

Estoy usando PHP, así que si esto no se puede hacer en una sola expresión regular, definitivamente estoy abierto a otras soluciones basadas en PHP.

Gracias

+3

Utilice una biblioteca de análisis de correo electrónico. No hay necesidad de hacer esto usted mismo. (No eres el primer programador de PHP que necesita analizar los encabezados de los correos electrónicos.) – Ether

Respuesta

6

Trate

\b[A-Z0-9._%+-][email protected](?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b 

(cortesía de RegexBuddy) como en

preg_match_all('/\b[A-Z0-9._%+-][email protected](?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b/i', $subject, $result, PREG_PATTERN_ORDER); 
$result = $result[0]; 

Nota del modificador /i para que sea sensible a las mayúsculas.

Consulte también this question para obtener una explicación de los inconvenientes de expresiones regulares para encontrar direcciones de correo electrónico en una cadena.

+3

gracias por permitir '+' en mi dirección de correo electrónico ... últimamente he encontrado algunos formularios de registro que no lo permiten. . realmente me molesta. – mpen

1

Obtuve la expresión regular de http://www.webcheatsheet.com/php/regular_expressions.php, y solo la modifiqué ligeramente.

$string = '"Joe Smith" <[email protected]>, [email protected]; [email protected] [email protected]'; 
$email_regex = "/[^0-9< ][A-z0-9_]+([.][A-z0-9_]+)*@[A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}/"; 
preg_match_all($email_regex, $string, $matches); 
$emails = $matches[0]; 

Ahora $ correos electrónicos tendrán una matriz con todas sus direcciones de correo electrónico.

1

Mientras que su pregunta era específico de expresiones regulares y Tim le dio una gran respuesta, para personas que buscan una solución simple, mira mailparse_rfc822_parse_addresses en la página http://php.net/manual/en/function.mailparse-rfc822-parse-addresses.php

cuenta que esto no es una función estándar de PHP y no requiere la instalación de la extensión . Es posible que las soluciones de alojamiento económico no le permitan instalar la extensión PECL.