正则表达式以yyyy-mm-dd格式匹配日期
-
19-09-2019 - |
题
我在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
被用户混合在一起。这并不能捕获所有日期混合,但确实保留了 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代码的示例。这两个项目在调试这类问题方面可能非常有用。
您可以尝试在表达式的开始和结尾处将A'^'和'$'符号放置:
/^[\d]{4}-[\d]{2}-[\d]{2}$/
分别匹配字符串的开始和末端。
不隶属于 StackOverflow