【问题标题】:PHP Dynamic Regular expression?PHP动态正则表达式?
【发布时间】:2009-12-05 08:39:49
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

    标签: php regex validation


    【解决方案1】:

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

    您以错误的方式使用字符类。 [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 是多余的),都在 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])$/
    

    【讨论】:

    • 感谢您的明确答复!我将使用 Rimian 提到的 checkdate 函数。
    【解决方案2】:

    您可以使用 PHP 日期和时间函数来做到这一点 http://php.net/manual/en/function.checkdate.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多