PHP动态正则表达式?

时间:2009-12-05 08:39:50

标签: php regex validation

我是正则表达式的新手,但我设法创建了一个工作表达式来验证日期(没有闰年,假设人们输入一个月有效的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}$/

当我尝试使用这个表达式时,它一直告诉我编译失败,因为字符类中的范围乱序。

我正在使用这个表达式来验证出生日期,如果每年都过去,最好不要更新它。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

我认为你应该考虑为此目的使用一些日期/时间函数。

你正在以错误的方式使用角色类。 [1-31][1-12][1900-2009]不会检查您拥有的范围。这不是character classes的工作方式,因此不是您使用正则表达式检查numeric ranges的方式。

字符类[a-r]匹配从ar的所有字符。 [a-rx]匹配ar中的任何字符和字符x。同样,[1-39]匹配13中的任何字符和字符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