正则表达式中的可选字符

时间:2015-04-20 10:12:24

标签: php regex validation date

我发现了这个REGEXP:

^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$

以这种格式验证日期非常有用:

yyyy-mm-dd

与" - "作为分隔符。除了我想做到这一点之外,它对我来说是完美的:

1970-1-1

也有效,所以我正在寻找修改,将月份和日期块中的零可选作为第一个字符。你能帮我一下吗?

4 个答案:

答案 0 :(得分:2)

如果您想要一个可选的零,您可以使用此RegEx(您自己的编辑版本):

^[0-9]{4}-((?:0)?[1-9]|1[0-2])-((?:0)?[1-9]|[1-2][0-9]|3[0-1])$

要使RegEx中的字符(或范围)成为可选项,请将其放在括号后面加上问号:

[a-z]是强制性的

([a-z])?是可选的,带有捕获组

(?:[a-z])?没有捕获组,只是可选的

Read more关于RegEx中的捕获组

答案 1 :(得分:1)

您可以使用类似的内容:^[0-9]{4}-(([1-9])|(0[1-9]|1[0-2]))-(([1-9])|(0[1-9]|[1-2][0-9]|3[0-1]))$

有一个例子here

答案 2 :(得分:1)

使用您当前的正则表达式只需0可选0?

即可
^[0-9]{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][0-9]|3[0-1])$

DEMO

答案 3 :(得分:0)

PHP已经有一个提取日期的构造;如果您使用正则表达式来提取日期,请"Now you have two problems"

PHP的DateTime::createFromFormat:“返回根据指定格式”

格式化的新DateTime对象

您可以使用dj选项接受1或2位数天,mn选项接受1或2位数月份。

您要使用的格式为:"Y-m-d"