我有一个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'
}
输出:
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的专业知识
答案 0 :(得分:4)
您在正则表达式字符串末尾使用^
,^
的含义是比较字符串的开头。
此外,正如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)));
}
m / d / y 或 dmy 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠(/),然后假设美国人 m / d / y ;而如果分隔符是破折号( - )或点(。),则假定为欧洲 d-m-y 格式。
答案 1 :(得分:1)
我现在就开始工作了!新输出已停止显示100%作为日期,这是我的计划。这是完成工作的最终代码片段
public function is_Date($str){
$str = str_replace('/', '-', $str);
$stamp = strtotime($str);
if (is_numeric($stamp)){
$month = date( 'm', $stamp );
$day = date( 'd', $stamp );
$year = date( 'Y', $stamp );
return checkdate($month, $day, $year);
}
return false;
}
echo "A million thanks to you all ! you guys are the best !";