2014-06-07 269 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