Re: Checking for a valid email address
- From
- demerphq <demerphq@gmail.com>
- Date
- Feb 27, 2009, 09:20 UTC
- Message-ID
- <9b18b3110902270120t15babbc0oe2975c086297e1e0@mail.gmail.com>
- In-Reply-To
- <799406d60902261928q2c691112yf24d01b92a3dad6c@mail.gmail.com>
2009/2/27 Adam Mercer <ramercer@gmail.com>:
Show 10 quoted lines
> Hi > > We are in the process of migrating some of our repositories from CVS > to Git in a two step process, first to a centralised Git setup then > (hopefully) onto a more distributed development model. In the testing > we have been doing so far the only problem we have run into is > developers not setting their email addresses correctly so the > changelogs are filled with spurious address. Does anyone know of a > pre-commit hook that could check for a valid email address prior to > allowing a commit? Or another way that this can be acheived?
If you are using Perl 5.10 or later then you can use the following regex:
my $email = qr {
(?(DEFINE)
(?<address> (?&mailbox) | (?&group))
(?<mailbox> (?&name_addr) | (?&addr_spec))
(?<name_addr> (?&display_name)? (?&angle_addr))
(?<angle_addr> (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
(?<group> (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
(?&CFWS)?)
(?<display_name> (?&phrase))
(?<mailbox_list> (?&mailbox) (?: , (?&mailbox))*) (?<addr_spec> (?&local_part) \@ (?&domain))
(?<local_part> (?&dot_atom) | (?"ed_string))
(?<domain> (?&dot_atom) | (?&domain_literal))
(?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
\] (?&CFWS)?)
(?<dcontent> (?&dtext) | (?"ed_pair))
(?<dtext> (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e]) (?<atext> (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
(?<atom> (?&CFWS)? (?&atext)+ (?&CFWS)?)
(?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
(?<dot_atom_text> (?&atext)+ (?: \. (?&atext)+)*) (?<text> [\x01-\x09\x0b\x0c\x0e-\x7f])
(?<quoted_pair> \\ (?&text)) (?<qtext> (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
(?<qcontent> (?&qtext) | (?"ed_pair))
(?<quoted_string> (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
(?&FWS)? (?&DQUOTE) (?&CFWS)?) (?<word> (?&atom) | (?"ed_string))
(?<phrase> (?&word)+) # Folding white space
(?<FWS> (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
(?<ctext> (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
(?<ccontent> (?&ctext) | (?"ed_pair) | (?&comment))
(?<comment> \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
(?<CFWS> (?: (?&FWS)? (?&comment))*
(?: (?:(?&FWS)? (?&comment)) | (?&FWS))) # No whitespace control
(?<NO_WS_CTL> [\x01-\x08\x0b\x0c\x0e-\x1f\x7f]) (?<ALPHA> [A-Za-z])
(?<DIGIT> [0-9])
(?<CRLF> \x0d \x0a)
(?<DQUOTE> ")
(?<WSP> [\x20\x09])
)(?&address) }x;
which is a fully RFC compliant perl regex for validating any email address.
Have fun, and if you use it credit Abigail of the Perl community for writing it.
cheers, Yves
-- perl -Mre=debug -e "/just|another|perl|hacker/"