我正在尝试使用正则表达式验证日期输入。
if(!preg_match("/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/", $_POST['variant']['sales_start'])) {
echo "invalid";
}
我想输入的字符串是2011-02-03,但它失败了,我似乎无法弄清楚原因。
有人可以告诉我我做错了吗?
提前致谢
答案 0 :(得分:5)
你用破折号分隔日期,而正则表达式正在寻找斜杠?
尝试
if ( !preg_match( "/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/", $_POST['variant']['sales_start'] ) )
{
echo "invalid";
}
答案 1 :(得分:4)
除了/
之外你还没有允许使用其他分隔符,但我也注意到你的正则表达式会允许像9999/99/99这样的东西。尝试这样的事情:
"/^(?:20|19)[0-9]{2}([-.\\/])(?:0?[1-9]|1[012])\\1(?:0?[1-9]|[12][0-9]|3[01])$/"
它并不完美,但它非常接近。这将允许以下任何一项:
它将禁止以下内容:
仔细检查[-.\\/]
部分;这些天我不习惯PHP,所以我不确定你是否需要\\
。
答案 2 :(得分:1)
此外,使用PHP函数checkdate()
以根据公历来验证您的日期 - http://php.net/manual/en/function.checkdate.php
答案 3 :(得分:1)
根据Justin的回答构建我想为文本格式的日期添加过滤。
允许:
等
"#^(((?:0?[1-9]|1[012])|(?:0?[1-9]|[12][0-9]|3[01])|([a-zA-Z]+))([.,]?[-.\\\/\s]))?(((?:0?[1-9]|1[012])|(?:0?[1-9]|[12][0-9]|3[01])|([a-zA-Z]+))([.,]?[-.\\\/\s]))?((?:20|19)[0-9]{2})$#"
我在此解决方案中将年限限制在19XX和20XX,但您可以根据需要进行修改。我也不允许将年份放在第一位,因为它不是典型的用户格式。
此外,如果您计划在JS中使用此功能,请务必删除两个分隔段中的额外“\”转义符。 (我发现PHP需要'/'才能在JS没有的情况下进行转义)