我在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}$/.

其他提示

您如何期望您的约会被终止?

如果是线结束,那么 $ 应该做到这一点。

如果由非数字角色,则以下负面 断言 (?!\d) 会同样工作。

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

我添加了一些额外的检查,以帮助解决 MMDD 被用户混合在一起。这并不能捕获所有日期混合,但确实保留了 YYYY 部分 20002029, , 这 MM 之间 0112DD 之间 0131

您可能想在表达式上放置锚点。 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}$/

分别匹配字符串的开始和末端。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top