2012-04-13 146 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%左右)