Extraire les adresses e-mail d'une chaine de caractères

Rechercher

Extraire les adresses e-mail d'une chaine de caractères

  • Par Emacs
  • 1 commentaire
  • 7 242 lectures
  • De Hugo HAMON
  • RSS -  Atom

Cette fonction permet d'extraire les adresses e-mails éparpillées ici et là dans un texte. Elle retourne un tableau contenant toutes les adresses e-mails uniques, c'est-à-dire que les adresses en double dans le texte ne sont enregistrées qu'une fois dans le tableau final.

C'est ce genre de fonctions qu'utilisent les groupes de hackers / spammers pour développer des bots qui parcourent les pages Internet pour en récolter des listes d'adresses e-mail. Je mets cette fonction à disposition dans un but purement éducatif pour présenter le principe et pour vous inviter à l'utiliser dans un contexte légal. En revanche, je ne peux être tenu responsable d'une quelconque utilisation illégale, malhonnête ou de quelconque dommage subit suite à son emploi.

Portion de code

<?php
/**
 * Extrait les adresses e-mails présentes dans une chaine.
 * La fonction retourne un tableau des adresses e-mails. Si
 * des adresses e-mails se trouvent en doublon dans la chaine,
 * alors la fonction ne gardera dans le tableau qu'un seul exemplaire
 * des adresses e-mails.
 *
 * @author Hugo HAMON <webmaster@apprendre-php.com>
 * @licence LGPL
 * @param string $sChaine la chaine contenant les e-mails
 * @return array $aEmails[0] Tableau dédoublonné des e-mails
 */
function extractEmailsFromString($sChaine) {
  if(false !== preg_match_all('`\w(?:[-_.]?\w)*@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})`', $sChaine, $aEmails)) {
    if(is_array($aEmails[0]) && sizeof($aEmails[0])>0) {
      return array_unique($aEmails[0]);
    }
  }
  return null;
}
/**
 * Exemple d'utilisation
 */
$sChaine = 'Paul Prédot (paul-predot@jambon.com);';
$sChaine.= ' Remi Martin (remi@martin.com);';
$sChaine.= ' Joseph Falco (joseph.falco@anyone.com);';
$sChaine.= ' Remi Martin (remi@martin.com);';
$sChaine.= ' Joseph Falco (joseph.falco@anyone.com)';
$aEmails = extractEmailsFromString($sChaine);
echo '<pre>';
print_r($aEmails);
echo'</pre>';
?>

Résultat

Array
(
    [0] => paul-predot@jambon.com
    [1] => remi@martin.com
    [2] => joseph.falco@anyone.com
)
1

Les commentaires

1. Par Mickaël Wolff le 12/06/2008 12:39

Ta regex ne prends pas en compte tous les cas prévus par la RFC qui va bien. Par exemple, les adresses suivantes sont rejetées, alors qu'elles sont bien formées :

mickael+toto@example.com
"mickael toto"@example.com

Il ne faut pas oublier aussi les tld de plus de 4 caractères (tels que... euh... attends... j'en ai déjà vu un... à voilà : .museum). Sans compter qu'en le cherchant, je viens de découvrir quelques TLD pas piqués des vers (http://en.wikipedia.org/wiki/Top-level_domain).

J'avais aussi fait un petit tuto, mais plus axé sur les regexp sur mon site web (http://lupusmic.org/pro/docs/regex.php). À noter que ma regexp n'est pas non non plus complète, parce que ce n'est pas évident d'en faire une correcte.