我在 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}/
,但它返回相同的结果。
任何帮助将不胜感激。
我在 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}/
,但它返回相同的结果。
任何帮助将不胜感激。
您需要的是锚点,特别是^
和$
. 前者匹配字符串的开头,后者匹配结尾。
我要说的另一点[]
是不必要的。\d
在字符范围之外保留其含义。
所以你的正则表达式应该是这样的:/^\d{4}-\d{2}-\d{2}$/
.
^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$
我添加了一些额外的检查来帮助解决用户混淆MM
的问题。DD
这并没有捕捉到所有的日期混淆,但确实保留了and 、between and和between and之间的YYYY
部分2000
2029
MM
01
12
DD
01
31
您可能想在表达式上放置锚点。IE
^[\d]{4}-[\d]{2}-[\d]{2}$
注意插入符号和美元符号。
[\d]{4}-[\d]{2}-[\d]{2}?
问号的意思是“非贪婪”
您可能想要前瞻断言(假设您的引擎支持它们,php/preg/pcre 支持)
前瞻断言(或肯定断言)允许你说“它后面应该跟着 X,但 X 不应该是匹配的一部分)。试试下面的语法
\d{4}-\d{2}-\d{2}(?=[^0-9])
断言是这部分
(?=[^0-9])
它是说“在我的正则表达式之后,下一个字符不能是数字”
如果这不能满足您的需求,请发布您的输入示例和您的 PHP 代码不起作用。这两个项目在调试这类问题时非常有用。
您可以尝试在表达式的开头和结尾同时放置一个 '^' 和一个 '$' 符号:
/^[\d]{4}-[\d]{2}-[\d]{2}$/
分别匹配字符串的开头和结尾。