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

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]',
)

Leave a Comment