【问题标题】:Domain specific email validation特定于域的电子邮件验证
【发布时间】:2013-12-13 20:14:33
【问题描述】:

我正在尝试编写一个注册表单,以验证用于注册的电子邮件。

简而言之,我想确保用于注册的电子邮件 ID 是公司域,而不是像 gmail 或 yahoo 这样的域名。

我有以下代码来检查电子邮件是否是给定域的一部分,我如何修改它以检查它是否在给定的域列表中? (例如:gmail.com、yahoo.com、hotmail.com 等)。

return (bool) preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[a-z]{2,4})$/i', $domain);

我认为应该是这样,但不完全确定:

function validate($email)
{
$error = 0;
$domains = array('gmail.com','yahoo.com','hotmail.com');
foreach($domains as $key=>$value)
{
if(preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[a-z]{2,4})$/i', $value)
{
$error=1;
}
}
if($error==0)
return true;
else
return false;

编辑:我尝试了这里给出的所有答案,无论我使用什么域,表单仍然可以毫无问题地提交! (即使是非电子邮件似乎也可以!)

这就是我调用函数的方式 -

if(isset($_POST['clients_register']))
{

        //Must contain only letters and numbers
        if(!preg_match('/^[a-zA-Z0-9]$/', $_POST['name']))
        {
            $error[]='The username does not match the requirements';        
        }
        //Password validation: must contain at least 1 letter and number. Allows characters !@#$% and be 8-15 characters
        if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,15}$/', $_POST['password']))
        {
            $error[]='The password does not match the requirements';
        }
        //Email validation
        if (validateEmail($_POST['email'])==false)
        {
            $error[]='Invalid E-mail';
        }       
        //Output error in array as each line
        if ( count($error) > 0) 
          {
            foreach ($error as $output) {
               echo "{$output} <br>";
            }
        } else {
            //Syntax for SQL Insert into table and Redirect user to confirmation page
        }
}

问题是,无论我做什么,用户都会被重定向到确认页面(即使是由数字组成的名称和像“table”这样的电子邮件。

【问题讨论】:

  • $email_parts = split('@',$email); if (in_array($email_parts[1],$domains) ............
  • 添加“googlemail.com”,它的另一个gmail域名...
  • 这些大邮件服务有什么问题?使用不在您列表中的域并不能保证它属于一家公司。公司也可能在其域下使用 Google 邮件。我想知道你想通过将这些列入黑名单获得什么效果。
  • 专门用来隔离没有自己域名的小型企业。解释起来很复杂,但无论如何我都感谢您的帮助!

标签: php validation


【解决方案1】:

您应该在单独的步骤中执行此操作。首先检查电子邮件地址是否具有有效的语法。然后提取域并查看它是否不在您的黑名单中。

function validate($email)
{
  if (!preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[a-z]{2,4})$/i', $email)) return false;

  $domains = array('gmail.com','yahoo.com','hotmail.com');
  list(, $email_domain) = explode('@', $email, 2);
  return !in_array($email_domain, $domains);
}

【讨论】:

  • 我试过这个,我已经用我打电话给电子邮件的方式编辑了我的原始帖子,但似乎仍然不起作用!
  • 验证函数是否正确。验证是否完成?问题出在其他地方。如果我输入了错误的用户名(如“W@rnold”)怎么办? $_POST['clients_register'] 是什么?为什么不改用if($_SERVER['REQUEST_METHOD'] === 'POST')) {
  • 这是我使用dreamweaver 的插入记录选项时的默认设置!但我会按照你的方式尝试,让你知道它是如何工作的!
【解决方案2】:
function validateEmail($email)
{
    // Etc, just an array of the blacklisted domains
    $blacklistDomains = ['gmail.com', 'yahoo.com', 'hotmail.com', 'googlemail.com']; 
    // Check if the email is valid
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }

    // Split the email after the '@' to get the domain
    $emailParts = explode('@', $email);

    if (in_array(end($emailParts), $blacklistDomains)) {
        return false;
    }

    return true;
}

您需要一个非常大的域列表。

【讨论】:

    【解决方案3】:

    PHP

    // Suposing that $email is a valid email
    function validate($email) {
        $invalidDomains = array('gmail.com','yahoo.com','hotmail.com');
        $parts = explode('@',$email);
        $domain = $parts[1];
        if(!in_array($domain,$invalidDomains)) return true;
        return false;
    }
    

    如果有用请告诉我。

    【讨论】:

      猜你喜欢
      • 2015-05-16
      • 2018-04-30
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2016-05-12
      • 2017-06-23
      • 1970-01-01
      相关资源
      最近更新 更多