我在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}/
,但它会返回相同的结果。
非常感谢任何帮助。
答案 0 :(得分:9)
你需要的是锚点,特别是^
和$
。前者匹配字符串的开头,后者匹配结束。
我要提出的另一点是[]
是不必要的。 \d
在字符范围之外保留其含义。
所以你的正则表达式应该是这样的:/^\d{4}-\d{2}-\d{2}$/
。
答案 1 :(得分:3)
答案 2 :(得分:3)
^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$
我添加了一些额外的检查,以帮助解决用户混淆MM
和DD
的问题。这并没有捕获所有日期混淆,但确保YYYY
部分保持在2000
和2029
之间,MM
部分保持在01
和12
之间以及DD
和01
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}$/
分别匹配字符串的开头和结尾。