这是我正在使用的正则表达式:
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。这是为什么?
感谢您提出任何建议。
答案 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/2012
或31/02/2012
,这也会验证为假。
答案 1 :(得分:1)
我已经检查了这个正则表达式,但它确实有效。
我向你提出一些建议,不要检查preg_match()
中的匹配数量(我经常看到这个)。这让我非常困惑,相信我。 == 0
表示如果找不到。就个人而言,我只是在布尔内容中使用它,即使preg_match()
返回整数(匹配数)而不是布尔值。但它并不重要 - PHP中的0
为false
,其他整数在布尔上下文中为true
。在这种情况下,它通常与您的期望相匹配 - 0匹配通常意味着失败。
其次,$collectiondate
以外的false
没有作业。我不知道这是否是故意的,但如果你从未发送任何正值,通常是null
或false
。在布尔上下文中,这两个值都返回false
。实际上,false == null
因为null
被转换为布尔值(但是false !== null
,因为!==
会跳过任何转化(最好使用===
代替{ {1}} https://stackoverflow.com/a/80649/736054)中提到的原因。{/ p>