我有一个
PHP方法检查是否
传入参数是一个日期.这是它:
传入参数是一个日期.这是它:
public function is_Date($str){ if (is_numeric($str) || preg_match('^[0-9]^',$str)){ $stamp = strtotime($str); $month = date( 'm',$stamp ); $day = date( 'd',$stamp ); $year = date( 'Y',$stamp ); return checkdate($month,$day,$year); } return false; }
然后,我测试开这样:
$var = "100%"; if(is_Date($var)){ echo $var.' '.'is a date'; } $var = "31/03/1970"; if(is_Date($var)){ echo $var.' '.'is a date'; } $var = "31/03/2005"; if(is_Date($var)){ echo $var.' '.'is a date'; } $var = "31/03/1985"; if(is_Date($var)){ echo $var.' '.'is a date'; }
请注意,每个ifs还有一个else语句,如:
else{ echo $var.' '.'is not a date' }
OUTPUT:
100% is a Date 31/03/1970 is a Date 31/03/2005 is a Date 31/03/1985 is a Date
我的问题是,为什么100%显示为日期,为什么31/03/1985不被视为日期?
关于为什么的任何线索将受到高度赞赏,因为我不是在Regex的专业知识
你正在使用^在正则表达式字符串的末尾,^的含义是比较字符串的开头.
另外,正如hjpotter92建议的那样,你可以简单地使用is_numeric(strtotime($str))
你的功能应该是这样的:
public function is_Date($str){ $str=str_replace('/','-',$str); //see explanation below for this replacement return is_numeric(strtotime($str))); }
Dates in the m/d/y or d-m-y formats are disambiguated by looking at the separator between the varIoUs components: if the separator is a slash (/),then the American m/d/y is assumed; whereas if the separator is a dash (-) or a dot (.),then the European d-m-y format is assumed.