2011-08-09 155 views
1

一個簡單的電子郵件驗證腳本一直在我身上失敗。PHP的正則表達式

if(!preg_match('^[^@]{1,63} @ [^@]{1,255}$', $input)) { 
    return false; 
} 

它應該很簡單,確保一個'@'符號,正確的長度爲本地和域的地址。但有效的電子郵件仍未能通過此測試。在error_log中,我也不斷收到一條消息,'@'是一個未定義的變量。我想逃避它嗎?在他們面前放置反斜槓並沒有幫助。

在此先感謝。

*編輯:我想我應該指出,電子郵件驗證腳本還有很多,我只是沒有發佈,因爲這些部分工作正常。這顯然不是唯一的驗證,但它是唯一一個對我保持錯誤的人。

+0

爲什麼有周圍的'@'空間? – rockerest

+1

這對於'!「£$%^&*()@!」£$%^&*()'也會返回true。艱難時期。 – adlawson

+0

空間只是爲了讓眼睛更容易。真正的版本是沒有的。可能不應該添加,雖然。 – Renzo

回答

4

使用簡單的正則表達式驗證電子郵件肯定會失敗。檢查這篇文章,它經過與PHP正確驗證的電子郵件地址長度:

http://www.linuxjournal.com/article/9585?page=0,0

從那裏的意見,你也可以檢查PHP的filter_var功能,這看似簡單&有效(它幾乎總是最好不要重新發明輪子):

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) 
{ 
exit("E-mail is not valid"); 
} 
+0

哦,我意識到。這只是驗證的一部分,我經歷了很多其他步驟,只是這是一個不斷出現問題的部分,我無法弄清楚原因。 – Renzo

+0

我看到了,不過檢查filter_var是否爲你做了訣竅,畢竟它已經內置到PHP中,並且爲什麼重建已經存在並且可用的東西?你可以花費那個時間在你項目的其他部分:) –

+0

你意識到PHP內部的FILTER_VALIDATE_EMAIL實際上只是一個正則表達式? (不是最好的順便說一句) – mario

1

你不應該使用該正則表達式來驗證電子郵件地址。真。

無論如何,你的問題是preg_match語法,它作爲第一個參數接受格式爲/ [...] /的模式,其中PCRE delimiters

所以,你的電話是:

if(!preg_match('/^[^@]{1,63}@[^@]{1,255}$/', $input)) { 

但是,請不要使用這種方式。

0

請保持在月中旬表示,preg_match()preg_*()功能是不可靠的,因爲它們返回的失敗,無論是0false,因此,如果不能在錯誤拋出簡單。

考慮使用CleanRegex

if (pattern(('^[^@]{1,63}@[^@]{1,255}$')->matches($input)) 
{ 
    // Matches! :) 
}