为什么我的日期用正则表达式返回 false


Why does my Date return false with regular expression?

这是我使用的正则表达式:

if (preg_match("/^[0-9]{1,2}'/[0-9]{1,2}'/[0-9]{4}$/", $_POST["collection-date"]) === 0) {
        $errors .= "'n Error: Invalid Collection Date";
        $collectiondate = FALSE;
    }

目前$_POST['collection-date']等于 15/02/2012 并且仍然返回 false。这是为什么呢?

感谢您的任何建议。

$split = explode('/', $date);
if (!isset($split[2]) || !checkdate($split[1],$split[0],$split[2])) {
    $errors .= "'n Error: Invalid Collection Date";
    $collectiondate = FALSE;
}

如果有人输入无效的日期,例如您可能也想要的无效日期,例如 99/99/201231/02/2012,这也验证 false。

我已经检查了这个正则表达式,它可以工作。

我给你一个小建议,不要检查preg_match()的匹配数(我经常看到这个(。这很令人困惑,相信我。 == 0的意思是如果没有找到它。就个人而言,我只是在布尔内容中使用它,即使preg_match()返回整数(匹配数(而不是布尔值。但这并不重要 - PHP 中的0false的,其他整数在布尔上下文中是true的。在这种情况下,它通常符合您的期望 - 0 匹配通常意味着失败。

其次,除了false之外,没有分配给$collectiondate。我不知道这是否是故意的,但是如果您从不发送任何正值,则通常是nullfalse。在布尔上下文中,这两个值都返回 false 。事实上,false == null是因为null被转换为布尔值(但false !== null,因为!==跳过任何转换(出于 https://stackoverflow.com/a/80649/736054(中提到的原因,最好使用 === 而不是 ==(。