【问题标题】:regex birthday validation正则表达式生日验证
【发布时间】:2013-11-30 10:11:35
【问题描述】:

我有一个验证生日的正则表达式:

if(!preg_match('/^(0?[1-9]|1[012])[- .\/](0?[1-9]|[12][0-9]|3[01])[- .\/](19|20)?[0-9]{2}$/', $_POST['bday'])
{
    echo 'enter your birthdate in a valid format. mm/dd/yyy';
}

这是:

正确的月份

闰年日期不准确

2 月接受第 30 天和第 31 天

并且 20 年接受大于 2013 年

我只做对了几个月我怎样才能做更准确的生日验证?还是有其他方法可以验证生日?

我想要的输出是:

在 2 月份验证闰年日期

年份不得超过 2010 年

输出:

02/14/2010

我对正则表达式还很陌生,请帮忙?

【问题讨论】:

  • 不要为此使用正则表达式。正则表达式用于模式匹配,而不是像日期验证那样复杂。假设你想出了一个表达你想要的东西,那将是非常复杂和低效的。只需查看 PHP 日期/时间函数。

标签: php regex validation date


【解决方案1】:

正则表达式不适合解析日期。 PHP 已经有内置函数和类来执行此操作,您应该使用它来代替。下面是使用 PHP 的 DateTime 类(函数来自 Glavić,来自 php.net)的方法:

function validateDate($date, $format = 'm/d/Y')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date && $d->format('Y') <= 2010;
}

例如:

var_dump(validateDate('02/14/2010')); // bool(true)
var_dump(validateDate('02/14/2011')); // bool(false)

Demo!

【讨论】:

  • 如果年份不应该大于现在怎么办?
  • @Halfacht 将 $d-&gt;format('Y') &lt;= 2010 更改为 $d-&gt;format('Y') &lt;= date('Y')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多