【问题标题】:PHP email validation with filter_var() and preg_match()使用 filter_var() 和 preg_match() 进行 PHP 电子邮件验证
【发布时间】:2014-02-12 15:42:16
【问题描述】:

我正在尝试使用 good 电子邮件验证构建一个表单,我正在尝试使用 filter_var()preg_match() 结合使用,但下面的 if 语句不起作用。似乎只满足其中一个条件。我还能怎么写才能让它起作用?

$email = (isset($scrubbed['email']))
    ? filter_var($scrubbed['email'], FILTER_VALIDATE_EMAIL, FILTER_SANITIZE_EMAIL)
    : NULL
;

if ((!$email) && (!preg_match("/^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$/", $email))) {
    echo 'Invalid Email Address, please correct errors';
} else {
    $email = strip_tags($scrubbed['email']);
}

【问题讨论】:

  • 如果您已经使用filter_var 查看电子邮件,为什么还要使用preg_matchfilter_var 还不够吗?
  • "带有 good 电子邮件验证" 定义好?实际上,您可能想的更难。也许开源解决方案可能比重新发明轮子更好。

标签: php forms validation email


【解决方案1】:

再次验证电子邮件地址的目的是什么? PHP 的filter_var() 已经允许各种电子邮件变体,您可能永远不会创建一个与他们使用的更接近的正则表达式。

我使用的电子邮件验证如下所示(应用于您的代码):

<?php

if (isset($scrubbed["email"])) {

    // @see http://stackoverflow.com/a/574698/1251219
    if (strlen($scrubbed["email"]) > 254) {
        echo "The email address is too long: it must be 254 or less.";
    }

    // Validate syntax with PHP.
    if (($email = filter_var($scrubbed["email"], FILTER_VALIDATE_EMAIL)) === false) {
        echo "The email address has an invalid syntax.";
    }

    // Validate DNS reachability.
    $host = substr($email, strrpos($email, "@") + 1) . ".";

    if (!checkdnsrr($host, "A") && !checkdnsrr($host, "AAAA") && !checkdnsrr($host, "MX")) {
        echo "The email address is unreachable.";
    }
}

?>

有没有想过 PHP 的正则表达式是什么样的?

/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD

更多信息请访问Comparing E-mail Address Validating Regular Expressions

【讨论】:

    【解决方案2】:
    if ((!$email) && (!preg_match("/^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$/", $email)))
    

    应该是

    if ((!$email) || (!preg_match("/^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$/", $email)))
    

    ...

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2017-11-19
      • 2011-03-21
      • 1970-01-01
      • 2017-04-11
      • 2015-12-08
      • 2011-06-03
      • 1970-01-01
      • 2011-05-02
      相关资源
      最近更新 更多