Php正则表达式日期验证

时间:2011-02-17 17:24:24

标签: regex

我正在尝试使用正则表达式验证日期输入。

if(!preg_match("/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/", $_POST['variant']['sales_start'])) { 
  echo "invalid";
}

我想输入的字符串是2011-02-03,但它失败了,我似乎无法弄清楚原因。

有人可以告诉我我做错了吗?

提前致谢

4 个答案:

答案 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])$/"

它并不完美,但它非常接近。这将允许以下任何一项:

  • 1999年10月29日
  • 2011-1-13
  • 2013年6月5日

它将禁止以下内容:

  • 1999 / 10.29
  • 2011-6 / 20
  • 9090-76-56
  • 0000.00.00

仔细检查[-.\\/]部分;这些天我不习惯PHP,所以我不确定你是否需要\\

答案 2 :(得分:1)

此外,使用PHP函数checkdate()以根据公历来验证您的日期 - http://php.net/manual/en/function.checkdate.php

答案 3 :(得分:1)

根据Justin的回答构建我想为文本格式的日期添加过滤。

允许:

  • 2014年3月13日
  • 十月11,1940
  • 1910年7月
  • 2000年9月10日
  • 2010年1月17日
  • 20/11/1999

"#^(((?: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没有的情况下进行转义)