日期验证的正则表达式帮助 - dd/mm/yyyy - PHP

9

有人可以指出我在这个正则表达式中的错误吗:

if(preg_match("/^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$/", $_POST["date"]) === 0) {
   echo 'error';
}

基本上,我希望每次显示错误消息 - 除非格式正确(dd/mm/yyyy)。
上面的代码有什么问题?
非常感谢任何指针。
- 在发布后不久更新了上面的正则表达式 - 对此给您带来的不便深表歉意 -

1
使用在线正则表达式测试器,比如http://www.regexpal.com/。 - betontalpfa
5个回答

19

我认为你应该转义斜杠:/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/


非常感谢。我会很快点选绿色勾勾:) - michaelmcgurk
谢谢。这对我有帮助。已为你投票点赞。 - Kirk Patrick Brown

4

由于您将其用作正则表达式定界符,因此需要转义斜杠

/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/

或者使用不同的正则表达式分隔符

#^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$#

太棒了。现在完美运作了。我真是个傻瓜 :) - michaelmcgurk

4
您也可以使用这个:
([0-2]\d|3[0-1])\/(0\d|1[0-2])\/(19|20)\d{2}

如果您想区分日期和月份,但同时又只想验证两个世纪,可以这样做。


如果您需要捕获 ^([0-2]\d|3[0-1])\/(0\d|1[0-2])\/((?:19|20)\d{2})$ 并且已添加了开头和结尾锚点。还有一个错误,日期为零日和月份将会工作 '00/00/1999'。 - happy_marmoset

2
我用这个来检查日期。
private function validate_date( $date, $empty_allowed = true ) {

    if ( empty( $date ) ) {
        return $empty_allowed;
    }

    if ( ! strpos( $date, '/' ) ) {
        return false;
    }

    if ( substr_count( $date, '/' ) !== 2 ) {
        return false;
    }

    if ( preg_match( '/(0[1-9]|1[0-9]|3[01])\/(0[1-9]|1[012])\/(2[0-9][0-9][0-9]|1[6-9][0-9][0-9])/', $date ) !== 1 ) {
        return false;
    }

    $split = explode( '/', $date );

    return checkdate( $split[1], $split[0], $split[2] );

}

0

这是解决您问题最简单的方法。

^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$

输出结果看起来像 => 31/12/2019

测试演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接