我的Web应用程序中间有这段代码。
if (preg_match ("/^[-0-9]/", $strDate) == TRUE)
{
$dateParts = explode("-", $strDate);
if (count($dateParts) === 3)
{
try
{
if (checkdate($dateParts[0], $dateParts[1], $dateParts[2]) === TRUE)
{
return TRUE;
}
}
catch (Exception $e)
{
//purposely blank for now.
}
}
}
我还没有包含任何周围的代码,因为它是一个相当冗长的应用程序。首先,$strDate
变量我确切知道那里有什么。我可以在if
语句开始之前回复它。如果$strDate
是有效日期或者TBD'的任意组合。该声明按预期验证。无效日期进入函数时出现问题。
例如,
$strDate = '03-01-2017asdf';
使用此输入,我希望preg_match
能够捕获它并将其从if
语句中删除。相反,它运行try-except和php抛出一个非形成的数字错误。我在这里做错了什么想法?我确定它与我的preg_match
声明有关。
答案 0 :(得分:3)
将正则表达式更改为需要匹配,直到输入字符串结束:
/^[-0-9]+$/
所以添加+
表示你可以有多个数字和连字符,然后$
说前一个模式必须匹配,直到字符串结尾,所以不能添加任何其他模式就像你的例子。当然,您可以查找更复杂的正则表达式,检查日期的有效部分,连字符的数量等等,这些变得非常复杂,如this answer中所示。
答案 1 :(得分:0)
您的preg_match
会检查$strDate
是否以数字开头 - 而不是日期格式是否正确...由于03-01-2017asdf
以数字开头,因此条件为{{ 1}}。
对于给定的日期格式(TRUE
),您可以使用以下代码:
MM-DD-YYYY
答案 2 :(得分:0)
我建议您验证并格式化日期以使用Carbon
这里是一个代码示例,用于执行您在函数中执行的操作:
use Carbon\Carbon;
class DateHelper
{
/**
* @param $strDate valid format d-m-Y
*/
public static function validate($strDate)
{
try {
$carbon = Carbon::createFromFormat('d-m-Y', $strDate);
return true;
} catch (\Exception) {
//invalid date
}
return false;
}
}
var_dump(DateHelper::validate('03-01-2017asdf')); //return false
var_dump(DateHelper::validate('03-01-2017')); //return true
答案 3 :(得分:0)
验证日期的最优雅和最短的方法是使用DateTime
php对象。
你可以像这样构建你的函数:
function validateDate($date, $format = 'Y-m-d H:i:s')
{
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
复制
即。 :
var_dump(validateDate('03-01-2017asdf', 'm-d-Y')); // bool(false)
var_dump(validateDate('03-01-2017', 'm-d-Y')); // bool(true)
所以你的验证条件如下:
if (validateDate($strDate, 'm-d-Y')) {
...
// Do some stuff
...
}
希望它有所帮助。