2009-11-25 16 views
19

Mi cadena de texto es el siguiente:El uso de expresiones regulares para extraer nombre de usuario de la dirección de correo electrónico

[email protected] (John Doe) 

que necesito para obtener sólo la parte antes de la @ y nada más. El texto proviene de un objeto XML simple, si eso es importante.

El código que tengo se parece a esto:

$authorpre = $key->{"author"}; 
$re1 = '((?:[a-z][a-z]+))'; 

if ($c = preg_match_all ("/".$re1."/is", $authorpre, $matches)) 
{ 
    $author = $matches[1][0]; 
} 

A veces el nombre de usuario puede tener un número o un carácter de subrayado antes del símbolo @, que es donde se detiene la expresión regular que parece.

+0

Su expresión regular tiene un grupo de captura externa '()' y un grupo de no capturar interior '(' :). El grupo interno que no captura puede ser innecesario dado que desea capturar lo que está adentro. El '[a-z]' significa capturar una letra minúscula. El '[a-z] +' significa capturar 1 o más letras minúsculas. De modo que su expresión significa capturar todo lo que sea 2 o más letras minúsculas de largo. Si pusiera un '^' al principio de su expresión, se aseguraría de que la coincidencia solo tenga lugar desde el _beginning_ del texto. –

+0

No será muy divertido, me temo. Algunos ejemplos de cadenas es posible que desee probar: '" John Doe "@ example.com (John Doe)', '"(>'.')>"@example.com (John Doe)', 'foo @ [192.168. 2.1] (John Doe) ', '^.^@example.com (John Doe)', '" [email protected]@c"@example.com (John Doe) "' Sí, todos son válidos por correo electrónico direcciones :-) – Joey

+0

@Johannes: '" [email protected]@c"@example.com (John Doe) '¿realmente está permitido? Eso realmente complica las cosas ... – Welbog

Respuesta

59

La expresión regular que coincida con cualquier carácter y capturar hasta que alcanza el carácter @:

([^@]+) 

Eso parece que lo que necesita. Manejará todo tipo de variaciones extrañas en las direcciones de correo electrónico.


no estoy seguro de por qué Ben James suprimen la respuesta, ya que creo que es mejor que la mía. Voy a publicarlo aquí (a menos que desestime su respuesta):

¿Por qué utilizar las funciones de expresiones regulares en lugar de cadenas?

$parts = explode("@", "[email protected]"); 
$username = $parts[0]; 

No es necesario expresiones regulares en esta situación en absoluto. Creo que usar explode es una opción mucho mejor, personalmente.


Como Johannes Rössel señala en la dirección de análisis de los comentarios, el correo electrónico es bastante complicado. Si quiere estar 100% seguro de que podrá manejar cualquier dirección de correo electrónico técnicamente válida, tendrá que escribir una rutina que maneje las cotizaciones correctamente, porque las dos soluciones enumeradas en mi respuesta se ahogarán. direcciones como "[email protected]"@example.com. Puede haber una biblioteca que maneje este tipo de análisis sintáctico para usted, pero no lo conozco.

+0

dependiendo de qué tan intensa sea su expresión regular, personalmente me gusta la función de explosión. Se adapta bien a lo que está buscando. –

+2

¿Qué pasa con el dirección de correo electrónico '" a @ b "@ example.com'? – Joey

+1

La diversión nunca termina con las rutas de origen en las direcciones de correo electrónico: http://www.remote.org/jochen/mail/info/address.html –

2

me gustaría ir con $author = str_replace(strrchr($authorpre, '@'), '', $authorpre);

2

Se podría empezar usando mailparse_rfc822_parse_addresses para analizar la dirección y extraer sólo la especificación de dirección sin ningún nombre de visualización. Luego, puede extraer la parte anterior al @ con la expresión regular (.*)@.

2

@OP, si solo quiere obtener todo antes de @, solo use los métodos de cadena/matriz. No es necesario regex complicado.Explotar por "@", a continuación, eliminar el último elemento que es la parte del dominio

$str = '"[email protected]@doe"@domain.com (John Doe)'; 
$s = explode("@",$str); 
array_pop($s); #remove last element. 
$s = implode("@",$s); 
print $s; 

salida

$ php test.php 
"[email protected]@doe" 
3

Tal vez esta variante es un poco más lento que explotar(), pero sólo se necesita una cadena:

$name = preg_replace('/@.*?$/', '', $email); 
1

usar algo como esto:

list($username, $domain) = explode('@', $email . "@"); // ."@" is a trick: look note below 

Con esta solución, ya habrá rellenado dos variables con partes de la dirección de correo electrónico en una fila.

."@": Esto se hace para evitar en corto errores críticos con el comando de lista y asegurar que explode producirá al menos dos variables según sea necesario.

1
<?php 
$email = '[email protected]'; 
$domain = strstr($email, '@'); 
echo $domain; // prints @example.com 

$user = strstr($email, '@', true); // As of PHP 5.3.0 
echo $user; // prints name 
?> 

source

0

Ejemplo básico:

$email = "[email protected]"; 
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     list($user, $domain) = explode('@', trim($email) . "@"); 
    } else { 
     echo "Unable to get account info ...."; 
    } 

ejemplo complejo: Algo como esto para poblar campos Nombre y APELLIDO:

1) valid email ? if yes get the two parts user and domain. 
2) else set to something default etc. 
3) use the email address if we don't have a decoded value. 

Código:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     list($fname, $lname) = explode('@', trim($email) . "@"); 
    } else { 
     $fname = "Xdefault"; 
     $lname = "Ydefault"; 
    } 

    $fname = (!empty($decoded['firstname'][0])) ? $decoded['firstname'][0] : $fname ; 
    $lname = (!empty($decoded['lastname'][0])) ? $decoded['lastname'][0] : $lname ; 
0

Mi sugerencia:?

$email = '[email protected]'; 
$username = substr($email, 0, strpos($email, '@')); 

// Output (in $username): johndoe 
Cuestiones relacionadas