【发布时间】:2013-09-26 08:59:33
【问题描述】:
我正在寻找一种通用的方法来验证日期。
我想要的是某种实现验证规则的方法,例如:
First monday of month
monday or friday
Fourth day of month
有什么可以处理这样的要求吗?或者有人对我如何实现这一点有任何指示吗?
编辑:我很欣赏答案,但这是我现在最终使用的:
感谢您的所有回答。我实际上最终使用的(至少在我找到完美的解决方案之前)大致是这个功能:
function isDateValid($rule,$date){
$DATE = (int) $date;
/* Make it safe for eval */
preg_match_all('/:\w:|&&|\|\||<|=|>|!|\(|\)|\d+/i',$rule,$filteredRule);
$rule = implode('',$filteredRule[0]);
//replace rule notations
$f = function($str){
return "date('$str[1]',\$DATE)";
};
//Or if php < 5.3: $f = create_function('$str', 'return "date(\'$str[1]\',\$DATE)";');
$rule = preg_replace_callback('/:(\w):/i', $f, $rule);
//Evaluate expression
return @eval("return $rule;");
}
//Example of usage testing first of month:
var_dump( isDateValid(':d:==1',time()) );
这让我可以处理我的所有需求,以及 PHP 代码。使用它的人非常有限(
first monday of month::w:==1 && :d: <= 7
monday or friday : :w:==1 || :w:==5
Fourth day of month : :d: == 4
我希望有更好更灵活的解决方案或有关安全性的反馈(这可以注入恶意 php 代码吗?)
【问题讨论】:
-
你看过strtotime()函数还是DateTime object constructor?虽然
Monday or Friday对我来说毫无意义,但两者都应该处理你的其他两个例子 -
如果每周一和周五都做某事,这并不是毫无意义的。我想我要找的是像 crontab 解析器之类的东西。
-
您可以使用php.net/manual/en/function.date.php 使用maaaaaaany 参数来了解当天是否为星期一,是否为每月的第一天等等。如果要先检查日期是否存在,请使用 php.net/manual/en/function.checkdate.php 。此外,您可以直接使用 datetime 构造函数:php.net/manual/en/datetime.construct.php。随便想象一下,你需要的一切都已经包含在许多 PHP 库中了!
-
为什么不让用户输入 cronjob 语法?验证 = stackoverflow.com/questions/235504/…