我是正则表达式的新手,但我设法创建了一个工作表达式来验证日期(没有闰年,假设人们输入一个月有效的30或31位数字。)
这是表达:
/^\d[1-31]{2}\-\d[1-12]{2}\-\d[1900-2009]{4}$/
但我希望有一个动态的正则表达式,如:
$yearSpan = (date("Y") - 110)."-".date("Y");
/^\d[1-31]{2}\-\d[1-12]{2}\-\d[$yearSpan]{4}$/
当我尝试使用这个表达式时,它一直告诉我编译失败,因为字符类中的范围乱序。
我正在使用这个表达式来验证出生日期,如果每年都过去,最好不要更新它。
有什么建议吗?
答案 0 :(得分:3)
我认为你应该考虑为此目的使用一些日期/时间函数。
你正在以错误的方式使用角色类。 [1-31]
,[1-12]
和[1900-2009]
不会检查您拥有的范围。这不是character classes的工作方式,因此不是您使用正则表达式检查numeric ranges的方式。
字符类[a-r]
匹配从a
到r
的所有字符。 [a-rx]
匹配a
到r
中的任何字符和字符x
。同样,[1-39]
匹配1
到3
中的任何字符和字符9
- 因此它匹配1,2,3和9中的一个 - 而不是1中的任何数字按照你的预期到39。
[1-31]{2}
匹配两个连续的数字(最后一个是冗余的),两者都在1到3的范围内 - 33
是有效匹配。
要匹配1到31之间的数字,正确的正则表达式为0?[1-9]|[1-2][0-9]|3[0-1]
。 ('0?'负责01-09-2009
几个月:0?[1-9]|1[0-2]
年份:19[0-9]{2}|200[0-9]
-
不是角色类之外的元字符 - 你无需逃避它。
正确的正则表达式是:
/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/
如果您对捕获值不感兴趣,可以将其写为:
/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/
答案 1 :(得分:2)
您可以使用PHP日期和时间功能来完成此操作 http://php.net/manual/en/function.checkdate.php