[kwlug-disc] PHP, email addresses and regular expressions

Robert P. J. Day rpjday at crashcourse.ca
Tue Mar 30 14:50:00 EDT 2010


  i want to write a PHP function that takes a moderately sane email
address and breaks it into its components and returns those pieces as
an array.  there are only two possibilities i will accept:

  full addresses:  "Robert P. J. Day <rpjday at crashcourse.ca>"
  short addresses: rpjday at crashcourse.ca

what i want to get back is, in both cases above, the first two
elements of the array being the username ("rpjday") and domain
("crashcourse.ca"), and *then*, in the full case, the third element of
the array will be the full name ("Robert P. J. Day").  on totally
invalid email address, NULL shall be returned.

  in a few minutes, i lashed together the following:

=====

<?php

function break_email_into_pieces($arg)
{
    $full_ptn = '/^(.+) *< *(.+)@(.+)>$/';
    $short_ptn = '/^([^<]+)@([^>]+)$/';

    if (preg_match($full_ptn, $arg, $m)) {
        return array($m[2], $m[3], trim(trim($m[1]), '"'));
    } else if (preg_match($short_ptn, $arg, $m)) {
        return array($m[1], $m[2]);
    } else {
        return NULL;
    }
}

$addr = 'Robert P. J. Day <rpjday at crashcourse.ca>';
var_dump(break_email_into_pieces($addr));

$addr = '"Robert P. J. Day" <rpjday at crashcourse.ca>';
var_dump(break_email_into_pieces($addr));

$addr = '<rpjday at crashcourse.ca>';
var_dump(break_email_into_pieces($addr));

$addr = 'rpjday at crashcourse.ca';
var_dump(break_email_into_pieces($addr));

?>

=====

  it all seems to work and i don't need the routine to be
spectacularly robust since i'm extracting the addresses from emails as
they go flying by so i can assume there's a good chance they're
RFC3696-compatible and i'm just grabbing strings out of the To: and
From: fields of those addresses.

  thoughts?  anything critical i'm missing?  any elegant improvements?
it looks good now but i'm always open to good advice.

rday
--

========================================================================
Robert P. J. Day                               Waterloo, Ontario, CANADA

            Linux Consulting, Training and Kernel Pedantry.

Web page:                                          http://crashcourse.ca
Twitter:                                       http://twitter.com/rpjday
========================================================================




More information about the kwlug-disc mailing list