Regex 电子邮件正则表达式

Regex 电子邮件正则表达式,regex,validation,email,Regex,Validation,Email,可能重复: 重复: 我知道这是一个常见的问题,但我似乎仍然找不到一个很好的正则表达式来验证电子邮件地址 我真的没有时间去读规范,写我自己的。你以前用过什么,效果好吗?我真的不在乎100%符合规格,但越接近越好 ^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$ 这是一个非常棒的工具,可以帮助编写和检查表达式,不确定您是否拥有它,但希望它能有所帮助 这里有一个我使用的函数。它不

可能重复:

重复:

我知道这是一个常见的问题,但我似乎仍然找不到一个很好的正则表达式来验证电子邮件地址

我真的没有时间去读规范,写我自己的。你以前用过什么,效果好吗?我真的不在乎100%符合规格,但越接近越好

^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$
这是一个非常棒的工具,可以帮助编写和检查表达式,不确定您是否拥有它,但希望它能有所帮助


这里有一个我使用的函数。它不仅仅是通过正则表达式运行电子邮件地址,而是迄今为止我发现的最完整的解决方案:

function validEmail($email, $skipDNS = false)
{
   $isValid = true;
   $atIndex = strrpos($email, "@");
   if (is_bool($atIndex) && !$atIndex)
   {
      $isValid = false;
   }
   else
   {
      $domain = substr($email, $atIndex+1);
      $local = substr($email, 0, $atIndex);
      $localLen = strlen($local);
      $domainLen = strlen($domain);
      if ($localLen < 1 || $localLen > 64)
      {
         // local part length exceeded
         $isValid = false;
      }
      else if ($domainLen < 1 || $domainLen > 255)
      {
         // domain part length exceeded
         $isValid = false;
      }
      else if ($local[0] == '.' || $local[$localLen-1] == '.')
      {
         // local part starts or ends with '.'
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $local))
      {
         // local part has two consecutive dots
         $isValid = false;
      }
      else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
      {
         // character not valid in domain part
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $domain))
      {
         // domain part has two consecutive dots
         $isValid = false;
      }
      else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local)))
      {
         // character not valid in local part unless 
         // local part is quoted
         if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local)))
         {
            $isValid = false;
         }
      }

      if(!$skipDNS)
      {
          if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A")))
          {
             // domain not found in DNS
             $isValid = false;
          }
      }
   }
   return $isValid;
}
函数validEmail($email,$skipDNS=false)
{
$isValid=true;
$atIndex=strrpos($email,“@”);
如果(是布尔($atIndex)和&!$atIndex)
{
$isValid=false;
}
其他的
{
$domain=substr($email$atIndex+1);
$local=substr($email,0,$atIndex);
$localLen=strlen($local);
$domainLen=strlen($domain);
如果($localLen<1 | |$localLen>64)
{
//超出局部零件长度
$isValid=false;
}
else if($domainLen<1 | |$domainLen>255)
{
//超出域部分长度
$isValid=false;
}
else if($local[0]='.| |$local[$localLen-1]='.)
{
//局部零件以“.”开头或结尾
$isValid=false;
}
else if(预匹配('/\.\.\./',$local))
{
//局部部分有两个连续的点
$isValid=false;
}
else如果(!preg_match('/^[A-Za-z0-9\\-\\.]+$/',$domain))
{
//域部分中的字符无效
$isValid=false;
}
else if(preg\u匹配('/\.\.\./',$domain))
{
//域部分有两个连续的点
$isValid=false;
}
否则如果(!preg\u match('/^(\\\.\.[A-Za-z0-9!\\%&`\\/$\'*+?^{}\\\\.-])+$/',str\u替换(“\\\\”,”“,$local)))
{
//字符在本地部分无效,除非
//引用本地部分
如果(!preg_match('/^'(\\\\\“\\\[^”])+“$/”,str_replace(“\\\\”,“,$local)))
{
$isValid=false;
}
}
如果(!$skipDNS)
{
if($isValid&!(checkdnsrr($domain,“MX”)| | checkdnsrr($domain,“A”))
{
//在DNS中找不到域
$isValid=false;
}
}
}
返回$isValid;
}
该函数有一个可选$skipDNS参数,如果您不想验证hos的MX记录,可以将该参数设置为TRUE。否则,该函数将尝试验证提供的电子邮件地址是否确实映射到真实的电子邮件服务器


值得注意的是,大多数RegEx电子邮件验证技术将验证大多数电子邮件地址,但它们很可能允许一些精心编制的无效地址或最坏的地址。。在一些更模糊但有效的电子邮件地址上失败。有关详细信息,您可能希望查看描述电子邮件地址允许格式的。

关于电子邮件正则表达式有很多问题。这个正则表达式肯定会引发灾难性的回溯,这一点可以从下面的例子中得到证明。不要使用它-请参阅:
Awesome工具
不会警告灾难性的回溯。不确定RegexBuddy是否有,但这是我选择的工具。检查DNS记录。。。好办法!这实际上也有点容易重做。请参见此处的相关漏洞: