2012-04-13 140 views
0

我很欣賞有幾個電子郵件正則表達式,但沒有找到任何適合我的情況。電子郵件地址tld正則表達式

我們有一個與此正則表達式失敗的電子郵件系統:

if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { 
     $domain_array = explode(".", $email_array[1]); 
     if (sizeof($domain_array) < 2) { 
      $this->result = 0; 
     } 
     for ($i = 0; $i < sizeof($domain_array); $i++) { 
      if 
(!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|?([A-Za-z0-9]+))$", 
    $domain_array[$i])) { 
      $this->result = 0; 
      } 
     } 
     } 

試圖在格式的電子郵件地址發送電子郵件:

[email protected] 

我認爲這是多餘的。價值。這是造成這個問題,我不是非常有經驗的正則表達式來解決這個問題。誰能幫忙?

正則表達式..

^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|?([A-Za-z0-9]+))$ 

在此先感謝。

+3

的最後部分,請參閱http://stackoverflow.com/questions/201323/how-to-use-a-regular-expression-to-驗證-AN-電子郵件地址。不要使用正則表達式來驗證電子郵件地址。 – 2012-04-13 08:25:25

+0

它是現場系統的修補程序所必需的,在此階段沒有機會改變太多。 – ChelseaStats 2012-04-13 08:27:24

+0

ereg已棄用:http:// php。net/manual/en/function.ereg.php – Toto 2012-04-14 09:38:44

回答

1

正則表達式:

^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|?([A-Za-z0-9]+))$ 

應匹配域名的個別部分。對?

所以如果你有some-text.value.subdomain.domain.co.uk作爲域名。

您的代碼按點分割並嘗試匹配每個子部分。

因此,例如部分文字子域

這對上述正則表達式可以正常工作;只是|正在爲正則表達式引擎分心。

我會嘗試

^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$ 

代替。

雖然匹配域名的個別部分仍然不是一個好的正則表達式。 但我想你想在代碼庫中儘可能少地改變。

一個更好的應該只是交替

^[A-Za-z0-9-]+$ 
1

如果您正在查看電子郵件驗證,您應該使用filter_var()函數,它比正則表達式imho更好。

filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 
+1

如果你看看'filter_var()'的源代碼很冷,你會發現它的驗證也是基於正則表達式的 – 2012-04-13 08:28:32

+0

Ofcourse,但是仍然會跳動在代碼 – ChrisR 2012-04-13 09:37:26

+0

中編寫自己的正則表達式是的,但是該函數不工作比正則表達式更好「,因爲它是**正則表達式。它使用的是一種比** OP的**正則表達式更好的正則表達式。 – 2012-04-13 09:38:36

1

或者你可以使用這個表達式:

^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$ 

它匹配您指定的電子郵件並與其中大部分作品(99.99%左右)