I don't know of an existing tool/script, but here's a quick and dirty hack:
Code: Select all
^(?:"[^"@<>]+"|[^"@<>]+)?\s*(?:<[^@<>]+@.*?\.[^.\s]{2,}>|[^@<>]+@.*?\.[^.\s]{2,})(?: *, *(?:"[^"@<>]+"|[^"@<>]+)?\s*(?:<[^@<>]+@.*?\.[^.\s]{2,}>|[^@<>]+@.*?\.[^.\s]{2,}))*$
...
Yeah, ouch!
Of course, if you break that voodoo up, it looks a bit more maintainable:
Code: Select all
<?php
$tests = array(
'"John Doe" <me@johndoe.com>',
'John Doe <me@johndoe.com>',
'me@johndoe.com',
'"John Doe" <me@johndoe.com>, John Doe <me@johndoe.com>, me@johndoe.com, <me@johndoe.com>',
'"John Doe <me@johndoe.com> or John Doe me@johndoe.com>'
);
$name = '[^"@<>]+';
$email = '[^@<>]+@.*?\.[^.\s]{2,}';
$name_email = "(?:\"$name\"|$name)?\s*(?:<$email>|$email)";
$regex = "/^$name_email( *, *$name_email)*$/";
foreach($tests as $t) {
if(preg_match($regex, $t)) {
echo "OK : $t\n";
} else {
echo "WRONG : $t\n";
}
}
/* output:
OK : "John Doe" <me@johndoe.com>
OK : John Doe <me@johndoe.com>
OK : me@johndoe.com
OK : "John Doe" <me@johndoe.com>, John Doe <me@johndoe.com>, me@johndoe.com, <me@johndoe.com>
WRONG : "John Doe <me@johndoe.com> or John Doe me@johndoe.com>
*/
?>