web-dev-qa-db-fra.com

Utiliser regex pour extraire le nom d'utilisateur de l'adresse email

Ma chaîne de texte ressemble à ceci:

[email protected] (John Doe)

Je n'ai besoin que de la partie avant le @ et de rien d'autre. Le texte provient d'un simple objet XML si cela importe.

Le code que j'ai ressemble à ceci:

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

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

Parfois, le nom d'utilisateur peut avoir des chiffres ou un trait de soulignement avant le symbole @, qui est l'endroit où la regex s'arrête, semble-t-il.

27
mrpatg

L'expression régulière qui correspondra et capturera n'importe quel caractère jusqu'à atteindre le caractère @:

([^@]+)

Cela semble être ce dont vous avez besoin. Il va gérer toutes sortes de variations bizarres sur les adresses e-mail.


Je ne sais pas pourquoi Ben James a supprimé sa réponse, car j'estime qu'elle est meilleure que la mienne. Je vais le poster ici (à moins qu'il annule sa réponse):

Pourquoi utiliser regex au lieu de fonctions de chaîne?

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

Vous n'avez pas du tout besoin d'expressions régulières dans cette situation. Je pense qu'utiliser explode est une bien meilleure option, personnellement.


Comme le note Johannes Rössel dans les commentaires, l'analyse des adresses e-mail est plutôt compliquée. Si vous voulez être sûr à 100% que vous serez capable de gérer une adresse électronique techniquement valide, vous devrez écrire une routine qui gérera correctement les devis, car les deux solutions répertoriées dans ma réponse vont s'étouffer. des adresses comme "a@b"@example.com. Il se peut qu'une bibliothèque gère ce type d'analyse pour vous, mais je ne le sais pas.

77
Welbog

@OP, si vous voulez seulement tout obtenir avant @, utilisez simplement des méthodes string/array. Pas besoin de regex compliqué. Exploser sur "@", puis supprimez le dernier élément qui est la partie de domaine

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

sortie

$ php test.php
"peter@john@doe"
6
ghostdog74

Peut-être que cette variante est un peu plus lente que explode (), mais il ne faut qu'une chaîne:

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

Vous pouvez commencer par utiliser mailparse_rfc822_parse_addresses pour analyser l'adresse et extraire uniquement la spécification d'adresse sans nom d'affichage. Ensuite, vous pouvez extraire la partie avant @ avec l'expression regexp (.*)@.

2
markusk

J'irais avec $author = str_replace(strrchr($authorpre, '@'), '', $authorpre);

2
Arkh
<?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
?>

la source

2
munjal

J'ai utilisé preg_replace

$email_username = preg_replace('/@.*/', '', $_POST['email']);
1
michalzuber

Utilisez quelque chose comme ceci:

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

Avec cette solution, vous avez déjà renseigné deux variables avec des parties d'adresse électronique sur une ligne.

."@": Ceci est fait pour éviter les erreurs critiques avec la commande list et s'assurer que explode produira au moins deux variables selon les besoins.

1
kante

Exemple de base:

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

Exemple complexe: Quelque chose comme ceci pour remplir les champs Prénom et Nom:

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.

Code:

    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
Mike Q

Ma suggestion:

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

// Output (in $username): johndoe
0
webcoder