正则表达式以YYYY-MM-DD格式匹配日期

时间:2009-11-10 22:33:39

标签: php regex preg-match

我在PHP中有一个正则表达式,它以YYYY-MM-DD格式查找日期

我拥有的是:[\d]{4}-[\d]{2}-[\d]{2}

我正在使用preg_match来测试日期,问题是2009-11-10有效,但2009-11-1033434也有效。自从我完成正则表达式以来已经有一段时间了,我如何确保它在正确的位置停止?我尝试过/([\d]{4}-[\d]{2}-[\d]{2}){1}/,但它会返回相同的结果。

非常感谢任何帮助。

7 个答案:

答案 0 :(得分:9)

你需要的是锚点,特别是^$。前者匹配字符串的开头,后者匹配结束。

我要提出的另一点是[]是不必要的。 \d在字符范围之外保留其含义。

所以你的正则表达式应该是这样的:/^\d{4}-\d{2}-\d{2}$/

答案 1 :(得分:3)

您希望如何终止日期?

如果是行尾,那么后面的$就可以做到这一点。

如果使用非数字字符,则以下否定assertion (?!\d)同样有效。

答案 2 :(得分:3)

^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$

我添加了一些额外的检查,以帮助解决用户混淆MMDD的问题。这并没有捕获所有日期混淆,但确保YYYY部分保持在20002029之间,MM部分保持在0112之间以及DD01

之间的31

答案 3 :(得分:1)

你可能想把锚点放在表达式上。 即。

^[\d]{4}-[\d]{2}-[\d]{2}$
请注意插入符号和美元符号。

答案 4 :(得分:1)

[\d]{4}-[\d]{2}-[\d]{2}?

问号的意思是“非贪婪”

答案 5 :(得分:1)

你可能想要向前看断言(假设你的引擎支持它们,php / preg / pcre会这样做)

向前看断言(或肯定断言)允许你说“它应该跟随X,但X不应该是匹配的一部分。”尝试以下语法

\d{4}-\d{2}-\d{2}(?=[^0-9])

断言就是这部分

(?=[^0-9])

它说“在我的正则表达式之后,下一个字符不能是数字”

如果这不能满足您的需求,请发布您的输入示例和不起作用的PHP代码。这两个项目在调试这些问题时非常有用。

答案 6 :(得分:0)

您可以尝试在表达式的开头和结尾添加“^”和“$”符号:

/^[\d]{4}-[\d]{2}-[\d]{2}$/

分别匹配字符串的开头和结尾。