日期格式为2015/04/25 我正在尝试
^\d{4}\/\d{2}\/\d{2}$
它的工作正常,但我想验证月份应该小于12,而日期少于31
我试过这个
^\d{4}\/(\d{2}\<[12])\/\d{2}$
但它没有用。
PS:我在正则表达式中非常棒。
答案 0 :(得分:3)
您可以使用
^\d{4}\/(0\d|1[0-2])\/([0-2]\d|3[01])$
说明:
\d{4}
任意四位数字(0\d|1[0-2])
0(任何数字)或1(0至2),00 to 09
或10-12
([0-2]\d|3[01])
(0到2)(任何数字)或3(0或1),即00 to 29
或30 or 31
修改1:如果您想仅在01-12
匹配几个月而01-31
仅匹配一天(没有00
),您可以使用:
^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])$
Edit2:如果您希望严格验证日期,请使用@Wayne建议的explode
和checkdate
..因为它还包括闰年验证。< / p>
请参阅Demo
答案 1 :(得分:1)
正如jeroen在上面指出的那样,最好的解决方案是使用explode和checkdate函数的组合。正则表达式不会捕获从未发生的日期。
$exploded = explode("/", $date);
if(checkdate($exploded[1], $exploded[2], $exploded[0])){
//Valid date.
}
PS,您可能还想检查$ explosion数组中的元素数量,看看您期望三个字符串。
答案 2 :(得分:1)
这里是使用@karthik manchala所显示的相同原理的扩展版本
^((\d{4}\/(0[469]|11)\/(0[1-9]|1\d|30))|(\d{4}\/(0[13578]|1[02])\/([0-2]\d|3[01]))|(\d{4}\/(02)\/(0[1-9]|[12]\d)))$
它将过滤30和31以及2月29以上的所有内容。它不会在2月份识别何时使用28和29。
如果你想捕获闰年,你可以轻松地做到这一点,如果它是近期的最近日期或日期,因为它可以被4整除,你可以捕获2000年,2004年,2008年,2012年等但规则不一致