为什么我的Date使用正则表达式返回false?

时间:2012-02-15 20:15:07

标签: php regex datetime date preg-match

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

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。这是为什么?

感谢您提出任何建议。

2 个答案:

答案 0 :(得分:3)

$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,这也会验证为假。

答案 1 :(得分:1)

我已经检查了这个正则表达式,但它确实有效。

我向你提出一些建议,不要检查preg_match()中的匹配数量(我经常看到这个)。这让我非常困惑,相信我。 == 0表示如果找不到。就个人而言,我只是在布尔内容中使用它,即使preg_match()返回整数(匹配数)而不是布尔值。但它并不重要 - PHP中的0false,其他整数在布尔上下文中为true。在这种情况下,它通常与您的期望相匹配 - 0匹配通常意味着失败。

其次,$collectiondate以外的false没有作业。我不知道这是否是故意的,但如果你从未发送任何正值,通常是nullfalse。在布尔上下文中,这两个值都返回false。实际上,false == null因为null被转换为布尔值(但是false !== null,因为!==会跳过任何转化(最好使用===代替{ {1}} https://stackoverflow.com/a/80649/736054)中提到的原因。{/ p>