技术开发 频道

Web程序员必须掌握的五个正则表达式

匹配和分析一个email地址

这个表达式来自于Cal Henderson,他是编写Flickr的程序员,以及Building Scalable Web Sites一书的作者(这本书非常值得看)。更多的信息可以参考Cal关于分析email地址的文章。

这是一个庞大的正则表达式,但是当我们把它分成几个部分以后就会发现很容易理解。构造一个正则表达式多少有点像用巴克斯范式(BNF)描述一个语法。我们说做email判断的正则表达式比较容易,因为我们为了检测匹配需要做的很多事情已经在电子邮件的规范里面用BNF描述过了。这是关于email地址相关的规范,叫做RFC 822。下面就是一个检查有效e-mail地址的PHP函数:
function is_valid_email_address($email){ $qtext = '[^\x0d\x22\x5c\x80-\xff]'; $dtext = '[^\x0d\x5b-\x5d\x80-\xff]'; $atom = '[^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c'. '\x3e\x40\x5b-\x5d\x7f-\xff]+'; $quoted_pair = '\x5c[\x00-\x7f]'; $domain_literal = "\x5b($dtext|$quoted_pair)*\x5d"; $quoted_string = "\x22($qtext|$quoted_pair)*\x22"; $domain_ref = $atom; $sub_domain = "($domain_ref|$domain_literal)"; $word = "($atom|$quoted_string)"; $domain = "$sub_domain(\x2e$sub_domain)*"; $local_part = "$word(\x2e$word)*"; $addr_spec = "$local_part\x40$domain"; return preg_match("!^$addr_spec$!", $email) ? 1 : 0; }
这个里面比较新鲜的是‘\x##’这种写法,它表示一个字符的十六进制数值。这个只是一种另类的写法,用一个字符的编码值来代表字符(这个##代表的是特定字符的ASCII编码值)。总的来看,这是一个实际上非常简单,同时又让人一眼看上去上觉得非常复杂的正则表达式。在这里我就不再多做进一步分析了,因为在原作者文章里面有,感兴趣的朋友可以参考Cal的文章。

Tim Fletche已经吧Cal的原始版本PHP函数移植到了Ruby 和Perl,如何你的开发语言是这些,你可以去看看。
0
相关文章