In PHP, how do I extract multiple e-mail addresses from a block of text and put them into an array?

30,904

Solution 1

Your code is almost perfect, you just need to replace preg_match(...) with preg_match_all(...)

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

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

Solution 2

You're pretty close, but the regex wouldn't catch all email formats, and you don't need to specify A-Za-z, you can just use the "i" flag to mark the entire expression as case insensitive. There are email format cases that are missed (especially subdomains), but this catches the ones I tested.

$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]);

output:

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

Solution 3

I know this is not the question you asked but I noticed that your regex is not accepting any address like '[email protected]' or any address with a subdomain. You could replace it with something like :

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

which will reject less valid e-mail (although it is not perfect).

I also suggest you read this article on e-mail validation, it is pretty good and informative.

Solution 4

This detects all mail addresses:

$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);

then you can use $found_mails[0] array.

Solution 5

This regex will extract all unique email address from a url or file and output each in new line. It will consider all subdomains and prefix suffix issues. Find comfortable to use it.

<?
$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.";
}
?>

check here for more reference : http://www.php.net/manual/en/function.preg-match-all.php

Share:
30,904
HumbleHelper
Author by

HumbleHelper

Updated on December 22, 2020

Comments

  • HumbleHelper
    HumbleHelper over 3 years

    I have a block of text from which I want to extract the valid e-mail addresses and put them into an array. So far I have...

       $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
    

    However, I am getting an array with only one address. Therefore, I am guessing I need to cycle through this process somehow. How do I do that?