我需要在php中验证精确的日期格式。
在我的情况下,最佳日期格式应为:例如1/1/2017
(没有前导零)和代码应该允许我避免日期的其余格式。
以下代码是我写的但没有结果:
if(preg_match("/([1-9]|[1-2][0-9]|3[0-1]-([1-9]|1[0-2])-^[0-9]{4})$/", $date){
// insert into etc. etc....
}else{
// update etc. etc....
}
问题是代码没有正确验证日期;它接受各种日期格式。
我注意到OP提交的答案不是防弹的,所以我开始研究问题中的评论中提到的一些功能以及我自己的一些想法。
我同意apokryfos,因为使用正则表达式验证日期表达式不是最佳实践。纯正的正则表达式解决方案将成为一种越来越冗长且逐渐被理解的模式,因为它必须在过去和未来都要考虑闰年。出于这个原因,我已经调查了php提供的一些日期函数。
format
参数遵循DateTime::createFromFormat()的语法/规则:看看d
和j
是如何组合在一起的,m
和n
也是如此。因此,此函数将捕获无效日期,但不会捕获不需要的前导零。
%e
提供不带前导零的匹配日。此函数没有匹配非零前导月份数字的字符。此外,此功能可能会在操作系统上出现打嗝。if(!DateTime::createFromFormat('j/n/Y', $date))
的deceze建议的a slightly different scenario在这种情况下不起作用。 createFromFormat()将竭尽全力构建一个有效的日期 - 甚至像99/99/9999
这样的字符串也能完成它。为了创建最简洁的表达式,我可以使用DateTime类作为看似无懈可击的解决方案:
if (($d=DateTime::createFromFormat('n/j/Y',$date)) && $date==$d->format('n/j/Y')){
// valid
}else{
// invalid
}
在这种情况下,
strtotime()
可以使用单个条件,因为OP的日期格式使用斜杠作为分隔符,此函数将正确解析日期表达式“American-style”。这似乎是检查没有前导零的有效日期的最简单方法:Demo Link
if(date('n/j/Y',strtotime($date))==$date){ // valid }else{ // invalid }
如果您正在处理日期时间表达式并且不希望检查时间部分,则可以在条件行之前调用此行:
$date = explode(' ', $date)[0]; // create an array of two elements: date and time, then only access date
要么
$date = strstr($date, ' ', true); // extract substring prior to first space
你的日期分隔符是/
而不是-
,所以将\/
添加到qzxswpoi的正则表达式。并在正则表达式的开头使用/
:
^
你可以使用碳
if(preg_match("/^([1-9]|[1-2][0-9]|3[0-1])\/([1-9]|1[0-2])\/([0-9]{4})$/", $date){
几个小时后,我终于找到了正确的答案。 php的正确模式是使用单引号(')而不是双引号(“)例如:
$date->format('j')
这对我来说很好...感谢大家特别对@Mohammad Hamedani来说因为表达是正确的但f ****** g引用让我发疯了