web-dev-qa-db-fra.com

Comment obtenir l'adresse email d'une longue chaîne

En PHP, j'ai une chaîne comme celle-ci:

$string = "[email protected] MIME-Version: bla bla bla";

Comment puis-je obtenir l'adresse email uniquement? Y at-il un moyen facile d'obtenir la valeur?

28
athan_mj94

Si vous ne savez pas quelle partie de la chaîne séparée par des espaces correspond à l'adresse de messagerie, vous pouvez la scinder en espaces et utiliser

filter_var($email, FILTER_VALIDATE_EMAIL)

sur chaque sous-chaîne.

26
mandaleeka

En vous appuyant sur mandaleeka answer, coupez la chaîne en utilisant un délimiteur d'espace, puis utilisez filter_var pour le nettoyage, puis validez pour voir s'il ne reste qu'une adresse électronique légitime:

function extract_email_address ($string) {
    foreach(preg_split('/\s/', $string) as $token) {
        $email = filter_var(filter_var($token, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
        if ($email !== false) {
            $emails[] = $email;
        }
    }
    return $emails;
}
42
Rob Locke

basé sur constantine regex .. fonctionne avec le domaine d'adresse ip aussi.

$pattern="/(?:[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/";

//$pattern="/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/";

$subject="Hello [email protected] francis a@b words [email protected] words 2 words123 [email protected]";


preg_match_all($pattern, $subject, $matches);
15
user1046762

Mise à jour des réponses de @Rob Locken:

function extract_email_address ($string) {
   $emails = array();
   $string = str_replace("\r\n",' ',$string);
   $string = str_replace("\n",' ',$string);

   foreach(preg_split('/ /', $string) as $token) {
        $email = filter_var($token, FILTER_VALIDATE_EMAIL);
        if ($email !== false) { 
            $emails[] = $email;
        }
    }
    return $emails;
}
5
orafaelreis

Ce petit script PHP nous aidera à extraire l'adresse e-mail d'un long paragraphe ou d'un texte. Il suffit de copier-coller ce script et de l’enregistrer en tant que fichier PHP (extract.php):

$string="[email protected] MIME-Version: bla bla bla";

$pattern="/(?:[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/";

preg_match_all($pattern, $string, $matches);

foreach($matches[0] as $email){
    echo $email.", ";
}
?>

Le script ci-dessus produira ce résultat:

[email protected],
4
Mitul Nakum

Les adresses e-mail sont vraiment difficiles à filtrer à l'aide d'expressions régulières car il y a tellement de caractères possibles. Cela peut être fait, mais vous devrez peut-être en modifier quelques-uns pour obtenir exactement ce dont vous avez besoin.

Vous pourriez commencer par quelque chose comme ceci:

$string = "[email protected] MIME-Version: bla bla bla";
$matches = array();
$pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/'
preg_match($pattern,$string,$matches);

Et puis $ correspond devrait contenir votre adresse email.

3
Gabriel Hurley

Si l'adresse e-mail se trouve toujours au début de la chaîne, le moyen le plus simple de l'obtenir est simplement de scinder la chaîne sur toutes les occurrences du caractère d'espacement, puis de prendre la première valeur du tableau résultant.

Bien sûr, assurez-vous de vérifier qu’il s’agit bien d’une adresse électronique avant de l’utiliser.

Voir la fonction PHP 'split' pour plus de détails.

2
ravuya

cela a fonctionné pour moi

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

détecter une adresse email dans une chaîne

1
Constantin
$text = 'First Last <[email protected]>'
$emails = array_filter(filter_var_array(filter_var_array(preg_split('/\s/', $text), FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL));
1
Sureshkumar

J'ai également modifié la réponse de @Rob Locke. J'ai trouvé que cela ne fonctionnait pas pour moi car je devais d'abord séparer par des virgules, puis par des espaces.

function extract_email_addresses($sString)
{
  $aRet = array();
  $aCsvs = explode(',', $sString);
  foreach($aCsvs as $sCsv)
  {
    $aWords = explode(' ', $sCsv);
    foreach($aWords as $sWord)
    {
        $sEmail = filter_var(filter_var($sWord, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
        if($sEmail !== false)
            $aRet[] = $sEmail;
    }
  }
  return $aRet;  
}
0
Keith Ritter

Regardez Expressions régulières dans PHP .

Avec les expressions régulières, vous pouvez identifier n’importe quel motif de texte dans une chaîne donnée. Ils sont incroyablement utiles. Ainsi, même si vous pouvez vous en tenir à copier-coller un extrait de code d’une autre réponse pour le moment, vous devriez envisager de creuser un peu plus.

Cela peut paraître un peu complexe au début, mais cela en vaut vraiment la peine.

0
anderstornvig

Si c'est vraiment séparé de l'espace:

php > $matches = array();
php > preg_match('/^[^ ]*/', $string, $matches);
php > print_r($matches[0]);
[email protected]
0
Matthew Flaschen

Correspond à une expression régulière telle que - ([A-Za-z0-9-]+)@([A-Za-z0-9])\\.([a-z]{3}) ou quelque chose de similaire.

0
Erix