2010-02-24 19 views
8

que tienen la siguiente cadenaRegex: ¿Cómo pegar el correo electrónico antes del símbolo "@"?

First Last <[email protected]> 

me gustaría extraer

"first.last" 

de la cadena de correo electrónico utilizando expresiones regulares & PHP. ¿Como va esto?

¡Gracias de antemano!

+0

Al consultar las respuestas, es posible que desee tener en cuenta que '" e \ @w "@ example.com' es, técnicamente, una dirección de correo electrónico válida. – Erik

+0

Acabo de darme cuenta de que había más en la cadena que solo la dirección de correo electrónico. –

+0

Puede encontrar ['s ($ str) -> beforeLast ('@')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L399) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

5

sé la respuesta ya fue aceptada, pero esto va a funcionar en cualquier dirección de correo electrónico válida en el formato de: Name <[email protected]>

// Yes this is a valid email address 
$email = 'joey <"[email protected]"@example.com>'; 

echo substr($email, strpos($email,"<")+1, strrpos($email, "@")-strpos($email,"<")-1); 
// prints: "[email protected]" 

La mayoría de las otras soluciones publicadas se producirá un error en una serie de validez correos electrónicos.

2

¿No puede usar simplemente una función dividida? No uso PHP pero parece que esto sería mucho más simple si está disponible.

1

Si ese es el formato exacto obtendrá, a continuación, a juego en contra de la expresión regular

/<([^@<>]+)@([^@<>]+)>/ 

le dará, por ejemplo, first.last en el grupo de captura 1 y email.com en el grupo de captura 2.

+0

Tenga en cuenta que esto se atasca en las direcciones de correo electrónico que contienen múltiples @s. Sin embargo, dudo que esto sea un problema para la gran mayoría de los usuarios, y en este caso, una solución que funciona el 99.9% del tiempo requiere menos del 0.1% del esfuerzo necesario para lograr que el último 0.1% funcione correctamente. –

+0

con/levemente/más trabajo, puede encontrar el último @ en la cadena sabiendo que de acuerdo con el RFC, el nombre es la parte anterior a esa @ final. – Erik

5
$str ="First Last <[email protected]>"; 
$s = explode("@",$str); 
$t = explode("<",$s[0]); 
print end($t); 
+0

Ghostdog, también me gusta esta solución, pero para ser justos mi pregunta me pidió una expresión regular. Pero, sin embargo, su solución funciona muy bien, ¡gracias por su respuesta! – st4ck0v3rfl0w

+0

Por cierto, ¿qué hace print end()? – st4ck0v3rfl0w

+0

es suficiente. Es tu elección. Acabo de presentar una alternativa más simple para su muestra de cuerda en particular. end ($ t) es el último elemento de la matriz. verifique los documentos de PHP para obtener más información – ghostdog74

0

No hay necesidad de usar expresiones regulares; mucho más eficiente para usar algunas funciones de cadena simples.

$string = 'First Last <[email protected]>'; 
$name = trim(substr($string, 0, strpos($string, '<'))); 
+0

Excepto que obtendrá el "Primer Apellido" como resultado, no "primero.último" – Erik

3

Esto es mucho más fácil (después de comprobar que el correo electrónico es válida):

 
$email = '[email protected]'; 
$split = explode('@',$email); 
$name = $split[0]; 
echo "$name"; // would echo "my.name" 

para comprobar la validez, se puede hacer esto:

 
function isEmail($email) { 
    return (preg_match('/[\w\.\-][email protected][\w\.\-]+\.\[w\.]/', $email)); 
} 
if (isEmail($email)) { ... }

En cuanto a la extracción del correo electrónico de First Last <[email protected]> ,

 
function returnEmail($contact) { 
    preg_match('\b[\w\.\-][email protected][\w\.\-]+\.\[w\.]\b', $contact, $matches); 
    return $matches[0]; 
} 
Cuestiones relacionadas