2014-06-07 230 views

回答

3

这里有一个PCRE正则表达式(从PHP库中提取),将根据RFC 5322验证:

'/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z\d-]{64,})(?1)(?>([a-z\d](?>[a-z\d-]*[a-z\d])?)(?>(?1)\.(?!(?1)[a-z\d-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f\d]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f\d][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f\d]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?9)){3}))\])(?1)$/isD' 

不像彼得回答它允许单标签域名(这是语法上有效)和IPv6地址文字。

但是,我强烈建议根据RFC 5321进行验证,该验证不允许评论或折叠空白(语义上不可见,因此实际上不是电子邮件地址的一部分),也不允许过时的本地部分(可以重写为非过时的引用字符串):

'/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!"?(?>\\\[ -~]|[^"]){65,}"[email protected])(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?!.*[^.]{64,})(?>([a-z\d](?>[a-z\d-]*[a-z\d])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f\d]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f\d][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f\d]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?6)){3}))\])$/iD' 
+0

必须参考有关使用regexp进行电子邮件验证的参考QA:[使用正则表达式验证电子邮件地址](http://stackoverflow.com/q/201323/4074148) – Veve

0

使用这个正则表达式就像98%有效。它不验证如下:

[email protected]

[email protected]

[email protected][IPv6:2001:db8:1ff::a0b:dbd0]

但它涵盖一切

^(([^<>()[\\]\\.,;:\\[email protected]\"]+(\\.[^<>()[\\]\\.,;:\\[email protected]\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$ 

注:这是直接从一些生产Golang代码运所以增加了斜杠。

+0

这也接受garbase like'liar @ [999.999.999.999]' – Jasen

+0

骗子@ [999.999.999.999]:围绕IP地址的方括号被认为是有效的。 由互联网协议文字地址版本6 [RFC3513 ]或更高版本,通过在方括号(“[”和“]”)中封入IP字面来区分。这是URI语法中允许使用方括号字符的唯一地方。 – Jry9972