2011-09-16 27 views
2

preg_match("/^[-\w.][email protected]([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$/", $email);修改正則表達式來驗證電子郵件?

我想修改這個正則表達式來允許電子郵件如[email protected]

我怎樣才能做到這一點?

+0

強制鏈接:[Mail :: RFC822 :: Address:基於regexp的地址驗證](http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html) – sehe

+1

不要使用正則表達式驗證電子郵件。 [你會失敗](http://www.codinghorror.com/blog/2005/02/regex-use-vs-regex-abuse.html)。 –

+0

(另請注意,許多真實世界的地址不符合RFC822。) –

回答

5

只需添加+[-\w.]部分:

preg_match("/^[-\w.+][email protected]([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$/", $email); 

注意過濾擴展功能有一個電子郵件驗證器能夠正確地驗證電子郵件地址:

if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
    // invalid 
} 

filter_var[doc]FILTER_VALIDATE_EMAIL[doc]過濾器。

FYI這裏是the regex used by FILTER_VALIDATE_EMAIL

/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,}) 
(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(? 
:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22 
(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00- 
\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3 
F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5 
D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[ 
a-z0-9]+(?:-[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9] 
+))(?:-[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(
?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f 
0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9] 
{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?: 
:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(? 
:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(
?:[1-9]?[0-9]))){3}))\\]))$/iD 
+2

我建議您不要試圖使用RegEx,只需使用'filter_var'! – Alex

+1

頭腦鏈接到filter_var的手冊頁(供參考) – Hailwood

+0

@Hailwood - 這裏是:http://php.net/manual/en/function.filter-var.php –

1

只是想指出與以前的答案關注: '' '+' 和不能是電子郵件地址的用戶名部分中的第一個字符。正確的正則表達式應該是

preg_match("/^\w[-\w.+]*@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$/", $email); 

注意的是,爲了驗證對完整的RFC 2822,你需要這樣的事:

preg_match('/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/', $email); 

然而,這不是大多數應用程序非常實用。有關電子郵件地址的正則表達式驗證的詳細討論,請參見this page

+0

'。'在第一組中不會匹配任何字符,它在字符類內選擇[],因此它只匹配文字匹配。 –

+0

D'oh!好,趕快,謝謝。我已經更新了我的答案。 –

相關問題