0

Given a list of emails, formated:

  "FirstName Last" <[email protected]>, "NewFirst NewLast" <[email protected]>

How can I build this into a string array of Only email addresses (I don't need the names).

2
  • 1
    Don’t use regular expressions, use a parser. Commented Dec 2, 2009 at 14:58
  • Thanks guys, you pointed me in the right direction. Commented Dec 2, 2009 at 15:28

3 Answers 3

3

PHP’s Mailparse extension has a mailparse_rfc822_parse_addresses function you might want to try. Otherwise you should build your own address parser.

Sign up to request clarification or add additional context in comments.

3 Comments

+1 Reinventing the wheel = bad. Reinventing the wheel using regex = worse.
+1 I got carried away with the regex approach. This seems to be the way to do it.
Or, as read in this function comments, you can use this PEAR package : pear.php.net/manual/en/…
2

You could use preg_match_all (docs):

preg_match_all('/<([^>]+)>/', $s, $matches);
print_r($matches); // inspect the resulting array

Provided that all addresses are enclosed in < ... > there is no need to explode() the string $s.


EDIT In response to comments, the regex could be rewritten as '/<([^@]+@[^>]+)>/'. Not sure whether this is fail-safe, though :)


EDIT #2 Use a parser for any non-trivial data (see the comments below - email address parsing is a bitch). Some errors could, however, be prevented by removing duplicate addresses.

5 Comments

And, of course, this fails on e-mail addresses like ">"@example.com. Isn't e-mail great? Not that this expression wouldn't work for every e-mail in practice, in theory it's wrong. +1 anyway.
What if the quoted display name contains <…>?
Your failsafe still fails in theory: "@>"@example.com E-mail sucks. Still, I'm liking the effort you're putting into this. You can't really parse e-mail perfectly with a regular expression. At least not a very simple one. I believe there's one floating around that's several hundred characters that does the job. ex-parrot.com/pdw/Mail-RFC822-Address.html Turns out it's several thousand characters.
Now "<[email protected]>" <[email protected]> will result in two addresses.
@Gumbo In that case (i.e. name can contain < ... @ ...>) you should use a parser :)
1
<?php

 $s = "\"FirstName Last\" <[email protected]>, \"NewFirst NewLast\" <[email protected]>";

 $emails = array();
 foreach (split(",", $s) as $full)
 {
  preg_match("/.*<([^>]+)/", $full, $email);
  $emails[] = $email[1];
 }

 print_r($emails);
?>

1 Comment

What if the quoted display name contains a comma?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.