web-dev-qa-db-fra.com

En PHP, comment extraire plusieurs adresses électroniques d'un bloc de texte et les placer dans un tableau?

J'ai un bloc de texte à partir duquel je veux extraire les adresses électroniques valides et les mettre dans un tableau. Jusqu'à présent j'ai ...

   $string = file_get_contents("example.txt"); // Load text file contents
   $matches = array(); //create array
   $pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/'; //regex for pattern of e-mail address
   preg_match($pattern, $string, $matches); //find matching pattern

Cependant, je reçois un tableau avec une seule adresse. Par conséquent, je suppose que je dois suivre ce processus d’une manière ou d’une autre. Comment je fais ça?

26
HumbleHelper

Votre code est presque parfait, il vous suffit de remplacer preg_match(...) par preg_match_all(...)

http://www.php.net/manual/en/function.preg-match.php

http://www.php.net/manual/en/function.preg-match-all.php

11
stevendesu

Vous êtes assez proche, mais l'expression rationnelle ne capture pas tous les formats de courrier électronique et vous n'avez pas besoin de spécifier A-Za-z, vous pouvez simplement utiliser le drapeau "i" pour marquer l'expression entière sans tenir compte de la casse. Il y a des cas de format de courrier électronique qui sont manqués (en particulier les sous-domaines), mais cela concerne ceux que j'ai testés.

$string = file_get_contents("example.txt"); // Load text file contents

// don't need to preassign $matches, it's created dynamically

// this regex handles more email address formats like [email protected], and the i makes it case insensitive
$pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';

// preg_match_all returns an associative array
preg_match_all($pattern, $string, $matches);

// the data you want is in $matches[0], dump it with var_export() to see it
var_export($matches[0]);

sortie:

array (
  0 => '[email protected]',
  1 => '[email protected]',
  2 => '[email protected]',
  3 => '[email protected]',
  4 => '[email protected]',
)
28
Clay Hinson

Je sais que ce n'est pas la question que vous avez posée mais j'ai remarqué que votre regex n'accepte aucune adresse comme '[email protected]' ni aucune adresse avec un sous-domaine. Vous pouvez le remplacer par quelque chose comme:

/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/

qui rejettera les courriels moins valides (bien que ce ne soit pas parfait).

Je vous suggère également de lire cet article sur la validation des e-mails , il est plutôt bon et instructif.

19
Eric-Karl

Ceci détecte toutes les adresses mail:

$sourceeee= 'Here are examplr [email protected] and [email protected] or something more';

preg_match_all('/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/i', $sourceeee, $found_mails);

alors vous pouvez utiliser le tableau $found_mails[0].

5
T.Todua

Cette expression régulière extraira toutes les adresses électroniques uniques d'une URL ou d'un fichier et les affichera toutes dans la nouvelle ligne. Il traitera de tous les problèmes de sous-domaines et de suffixes de préfixes. Trouvez à l'aise de l'utiliser.

<?
$url="http://example.com/";
$text=file_get_contents($url);
$res = preg_match_all(
"/[a-z0-9]+[_a-z0-9\.-]*[a-z0-9]+@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/i",
$text,
$matches
);
if ($res) {
foreach(array_unique($matches[0]) as $email) {
echo $email . "<br />";
}
}
else {
echo "No emails found.";
}
?>

vérifier ici pour plus de références: http://www.php.net/manual/en/function.preg-match-all.php

2
Rebule

Cette fonction fonctionne correctement sans utiliser regex. Donc, il est vraiment plus rapide et peu gourmand en ressources.

<?php
function extract_email_addresses($str){
    $emails = array();
    $str = strip_tags( $str );
    $str = preg_replace('/\s+/', ' ', $str); 
    $str = preg_replace("/[\n\r]/", "", $str); 
    $remove_chars = array (',', "<", ">", ";", "'", ". ");
    $str = str_replace( $remove_chars, ' ', $str );
    $parts = explode(' ', $str);
    if(count($parts) > 0){
        foreach($parts as $part){
            $part = trim($part);
            if( $part != '' ) {
                if( filter_var($part, FILTER_VALIDATE_EMAIL) !== false){
                    $emails[] = $part;
                }                
            }
        }
    }
    if(count($emails) > 0){
        return $emails;
    }
    else{
        return null;
    }
}

$string = "Guys, please help me to extract valid [email protected] email addresses from some text content using php
example , i have below text content in mysql database ' Life is more beautiful, and i like to explore lot please email me to [email protected]. Learn new things every day. 'from the above text content i want to extract email address '[email protected]' using php regular expressions or other method.";

$matches = extract_email_addresses( $string );
print_r($matches);

?>
0
fatih

Cela a fonctionné mieux pour moi:

<?php
$content = "Hi my name is Joe, I can be contacted at [email protected].";
preg_match("/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})/i", $content, $matches);
print $matches[0];
?>

Certains des autres n'ont pas accepté les domaines tels que: [email protected]

Je l'ai trouvé sur: http://snipplr.com/view/63938/

0
Luis Rodriguez