2010-08-31 202 views
25

對於PHP什麼是使用預浸最好的電子郵件驗證,額日格因爲它是過時/刪除PHP電子郵件驗證

需要檢查站點存在(它不是像最大的安全性)。

我發現ereg很多方法,但他們(顯然)不是很好的做法。

回答

78

我建議你使用FILTER_VALIDATE_EMAIL過濾器:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    //valid 
} 

您還可以使用its regular expression直接:

"/^(?!(?:(?:\\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\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\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-f0-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" 

但在這種情況下,如果一個bug在正則表達式中,你」將不得不更新你的程序,而不是隻更新PHP。

+1

請記住,電子郵件也可以包含這些字符:''/ *'。所以這個驗證不會使數據庫安全。 – 2010-08-31 22:35:27

+0

filter_var()對我來說是新的。 FILTER_VALIDATE_EMAIL好嗎? – Marwelln 2010-08-31 22:36:41

+0

+1源代碼參考。很棒 – 2012-10-29 17:00:35

3

除非您想使用very very long regular expressions,否則您將遇到未覆蓋的有效電子郵件地址(請考慮Unicode)。僞造的電子郵件地址也會通過有效的驗證,那麼,如果您只需編寫[email protected]並放棄驗證,那麼驗證的重點是什麼?

驗證電子郵件地址的最佳方法是發送帶有鏈接的確認電子郵件以進行單擊。這隻有在電子郵件地址有效時纔有效:簡單,並且不需要使用正則表達式。

+0

就像我說的那樣,它不像最大的安全 – 2010-09-01 00:34:07

+4

合理的開發人員會在嘗試發送電子郵件到「字符串」之前一直檢查給定的地址是否有效。所以這不是一個爭論。但無論如何都應該選擇Doupble - 這不是問題。 – 2010-09-01 08:43:34

+0

@Jan:那麼,如果我的電子郵件是àèìòù@mydomain.com,您的搶先檢查會阻止我註冊到您的網站?只需發送一封確認電子郵件,即可設置,無需檢查有效性,並冒着阻止有效的電子郵件地址的風險。 – nico 2010-09-01 13:14:20

0
function check_email($check) { 
$expression = "/^[a-zA-Z0-9._-][email protected][a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/"; 
if (preg_match($expression, $check)) { 
    return true; 
} else { 
    return false; 
} 
} 

調用它,如果()條件如下面的例子:

if(!check_email($_REQUEST['ContactEmail'])){ 
    $register_error ="Enter the correct email address!<br />"; 
    $reg_error=1; 
} 
+0

任何人都可以告訴我什麼是這個代碼bcz一個人下來投票的問題。它工作正常。 – 2015-05-29 07:30:21

+0

這不是我投下的票,但....這不正確的過濾電子郵件地址,正確和完整的正則表達式可以在這裏找到:http://www.ex-parrot.com/~ pdw/Mail-RFC822-Address.html 其次,使用內置在FILTER_VALIDATE_EMAIL中的PHP將是過濾電子郵件地址的正確/最佳方法 – twigg 2016-06-30 13:48:34