2016-02-25 100 views
0

我們都知道了電子郵件地址驗證是一個敏感的問題,也有關於對付它不編碼整個RFC的最佳途徑這麼多意見。但自2009年以來,它變得更加困難,我還沒有真正看到任何人解決IDN的問題。的preg_match驗證(國際域名)

這裏是我一直使用的是什麼:

preg_match(/^[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,6}\z/i) 

這將爲大多數電子郵件地址,但如果我需要匹配一個非拉丁文的電子郵件地址是什麼工作?例如: - 鮑勃@中國。中國,或[email protected]рф完整列表

here。 (請注意列表底部的所有非拉丁域名擴展名。)

關於此主題的信息可以找到here,我想他們在說的是這些新字符將被簡單地理解爲'.xn - fiqz9s '和'.xn - p1ai'在機器級別上,但我不是100%確定的。

如果是,這是否意味着我需要考慮讓我的代碼下面唯一的變化? (對於域擴展名如.travelersinsurance和.sandvikcoromant)

preg_match(/^[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,20}\z/i) 

注意:這是不是與此頁面上找到的討論Using a regular expression to validate an email address

+1

這不是重複的,它要求的東西,當引有人問根本不存在。 –

+0

@Stilleur國際域名方面(IDN的)驗證不被任何該網頁上的討論。 – Vince

+0

@Vince是的,對不起。正如我剛剛標記你的問題。我問自己,我怎樣才能取消它(我贊成它,因爲它是非常interresting)。 – Stilleur

回答

-1

這是我最終想出來的。

preg_match(/^[\pL\pM*+\pN._%+-][email protected][\pL\pM*+\pN.-]+\.[\pL\pM*+]{2,20}\z/u) 

此使用Unicode正則表達式像\ PL\ PM * +\對-N幫我處理任何語言的字符和數字。

\ pL任何類型的來自任何語言的信件,大寫或小寫。

\ pM * +匹配零個或多個組合標記的代碼點。意圖與另一個字符(例如,重音,變音符號,封閉盒等)組合的字符。

\對-N任何數字。

表達上面會很好地工作像[email protected]和正常的電子郵件地址,像刺耳的電子郵件地址A.S中3_yÄhমহাজোটেরOO文%網+d-fελληνικά@πyÄhooαράδειγμα.δοκιμή。

這並不是說我不信任的人能在輸入自己的電子郵件地址,但人不犯錯誤,我可以在其他情況下使用此代碼。例如:我需要仔細檢查現有10,000個電子郵件地址列表的完整性。此外,我總是被教導不信任用戶輸入並始終過濾。

UPDATE

我剛剛發現解析爲UTF-8含量正常的字符串,它不能正常使用電子郵件字段,因爲瀏覽器轉換領域工作時,像phpliveregex.com網站,雖然這個完美的作品時,測試和本地的內容類型爲正常拉丁文。因此,像鮑勃@中國的電子郵件地址。中國,或[email protected]рф不通過服務器[email protected],或[email protected]接收到之前被轉換。我原來的過濾器中唯一真正缺少的是從域擴展中包含連字符。

這裏是最後的版本:

preg_match('/^[a-z0-9%+-._][email protected][a-z0-9-.]+\.[a-z0-9-]{2,20}\z/i'); 
+0

這個正則表達式不允許所有可能的有效電子郵件地址。見http://stackoverflow.com/questions/4816424/are-single-quotes-legal-in-the-name-part-of-an-email-address – deceze

2

我會堅持與嘗試和真正的建議,你應該給他們發送驗證郵件。不需要一個花哨的正則表達式,需要一次又一次地更新。假設他們知道他們的電子郵件地址並讓他們輸入。

這就是當這種情況出現時我一直在做的。如果有的話我會讓他們兩次輸入他們的電子郵件。它可以讓你騰出更多時間在網站/項目的重要部分。

+0

我愛這些網站,要求我輸入兩次(複製粘貼);-) – 2016-02-25 22:00:30

+2

'onpaste =「返回false;」'(手指槍:皮尤pew) – Iwnnay

3

考慮:你彌補自己的新的正則表達式沒有根據RFC完整規範驗證地址每次,你要做的僅僅是這種情況,使用「異國情調「的電子郵件地址在網絡上變得更糟。你正在發明官方RFC規範的一些新的ad-hoc子集或超集;這意味着你要麼有假陽性或假陰性或兩者兼而有之,你會拒絕的人使用他們的實際地址,因爲你的正則表達式不佔他們正確的,否則你會接受這實際上是無效的地址。

添加到即使地址是語法上有效的,仍然不意味着一)地址實際上(仍然)存在,B)屬於該用戶或c)實際上可以接收電子郵件。在事物的授予計劃中,驗證語法是一個極其不重要的問題。

如果你要在所有的驗證語法,要麼做一個非常粗略的常規檢查,這肯定不會拒絕,驗證根據所有RFC規則的任何有效的地址(例如/[email protected]+/);不要在你剛剛想到的一半之間做一些嚴格但並非真正的驗證。