【问题标题】:PHP - Filtering e-mail adressesPHP - 过滤电子邮件地址
【发布时间】:2015-06-14 19:20:00
【问题描述】:

我有一个注册脚本,我希望只有拥有特定电子邮件地址的用户才能注册。 (例如:所有电子邮件必须以“@test-test.com”结尾)

这是我的代码:

if (isset($_POST['username'], $_POST['email'], $_POST['p'])) {
    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
    $email = filter_var($email, FILTER_VALIDATE_EMAIL);
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error_msg .= '<p class="error">Invalid e-mail Adress!</p>';
    }

我知道我不能为此使用 FILTER_SANITIZE_EMAIL ......谁能告诉我如何做到这一点?提前致谢。

【问题讨论】:

  • 试试我的更新代码,这将允许您设置允许的电子邮件地址

标签: php validation email


【解决方案1】:

试试这个

    <?php

    $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

    if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
          echo 'Invalid Email';
          die;
    }
    $allowedEmail = array(
                        'gmail.com',
                        'yahoo.com',
                        'stack.com',
                    ); // ALLOWED EMAIL DOMAINS SHOULD BE ADDED INTO THIS ARRAY.

    $emailArr = explode('@', $email);

    if(in_array($emailArr[1], $allowedEmail)) {
        echo 'allowed Email';
    } else {
        echo 'Not allowed Email';
    } 

?>

【讨论】:

    【解决方案2】:

    试试这个 - 将检查电子邮件中的正确字符以及是否包含格式正确的电子邮件地址:

    $error = 0;
    if($_POST['email']){
        if (!ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.
                 '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $_POST['email'])){
                    // your mail is incorrect.
                    $error++;
        }
    }
    
    if($error == 0)
    {
       // you have no errors, manipulate entered data
    }
    

    【讨论】:

    • as per php.net/manual/en/function.ereg.php '从 PHP 5.3.0 开始,该函数已被弃用。强烈建议不要依赖此功能。'
    • 除了@Arun 所说的之外,这并不能回答问题(看起来像是一段从很久以前流传下来的复制代码;)
    • Arun,我正在开发 5.3.8,它运行良好。安全性因服务器配置而异,不仅在 PHP 上。如果你设置你的服务器正确,它会是安全的。
    【解决方案3】:

    您可以为此使用正则表达式

     $email = 'myname@sample.com';
     $regex = '/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@test\-test\.com$/';
    
     if(preg_match($regex, $email))
     {
        echo 'Valid';
     }
     else
     {
        echo 'Invalid';
      }
    

    【讨论】:

      【解决方案4】:

      你可以使用这段代码:

      if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
          //valid
      }
      

      PHP 版本:5 >= 5.2.0

      http://php.net/manual/en/function.filter-var.php

      【讨论】:

        【解决方案5】:

        我认为您应该首先使用filter_var 确保电子邮件有效,然后查看它是否具有正确的域,例如通过preg_match:

        function tellMeIfThisIsValid($email) {
            $allowedDomain = '@test-test.com';
        
            $isValid = FALSE;
            if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false) {
                if (preg_match('/' . preg_quote($allowedDomain) . '$/', $email)) {
                    $isValid = TRUE;
                }
            }
            printf("%-25s => %s" . PHP_EOL, $email, $isValid ? 'valid' : 'not valid');
        }
        
        tellMeIfThisIsValid('test@test-test.com');
        tellMeIfThisIsValid('test.test@test-test.com');
        tellMeIfThisIsValid('@test-test.com');
        tellMeIfThisIsValid('test@test-test.com.se');
        tellMeIfThisIsValid('test@anothertest-test.com');
        tellMeIfThisIsValid('test@testtest.com');
        

        输出:

        test@test-test.com        => valid
        test.test@test-test.com   => valid
        @test-test.com            => not valid
        test@test-test.com.se     => not valid
        test@anothertest-test.com => not valid
        test@testtest.com         => not valid
        

        【讨论】:

          【解决方案6】:

          非常感谢您的回答!这对我有用:

          $check = "/^[_a-z0-9-.]*@test-test.comt$/i";
            $email = $_POST['email'];
            
            if (!preg_match ($check, $email))
            {
              $error_msg .= '<h4 class="sans-serif">Invalid Email adress!</h4>';
            }

          【讨论】:

          • 此解决方案存在一些问题。首先,$check 正则表达式以comt 结尾,而它应该是com,但我想这只是一个错字。其次,$check 中的点将匹配 any 字符,因此它确实会匹配test@test-test.com,但也匹配test@test-testXcom。有关使用 preg_quote 处理此问题的示例,请参阅我的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2012-01-25
          • 2012-12-14
          • 1970-01-01
          • 2011-10-28
          • 2020-02-01
          • 1970-01-01
          相关资源
          最近更新 更多