使用正则表达式逐步验证时间戳

时间:2018-03-03 19:48:08

标签: javascript php regex laravel timestamp

此正则表达式验证时间戳,例如2018-02-12 00:55:22:

201 => true
201a => false
2018- => true
20189 => false

但是,时间戳应该逐步验证:

| name | type | score |
+------+------+-------+
|  a   |   1  |  15   |
+------+------+-------+
|  b   |   2  |  12   |
+------+------+-------+
|  c   |   1  |  17   |
+------+------+-------+

是否有一个很好的(短)正则表达式扩展?

...

3 个答案:

答案 0 :(得分:1)

因为你的问题有javascript标签我会假设你正在做"一步一步"验证像" onkeyup"或类似的。以下模式将验证您的日期时间字符串,因为它正在构建(我将包含空字符串作为有效,以便在空时不触发任何标记;但如果您想要操作,则可以更改为\d{1,4}空字符串)。

我尽可能使用\d来减少模式长度。

x模式修饰符与我的转储模式一起使用,以便于阅读。将此应用到项目时,可以压缩所有内容并删除x标记。

我习惯使用非捕捉群体;因为你可能只是匹配,所以你可以使用捕获组。

Pattern Demo

模式:

~
^
(?:
\d{0,4}|
\d{4}-|
\d{4}-[01]|
\d{4}-(?:0[1-9]|1[0-2])|
\d{4}-(?:0[1-9]|1[0-2])-|
\d{4}-(?:0[1-9]|1[0-2])-[0-3]|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s[0-2]|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s(?:2[0-3]|[01]\d)|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s(?:2[0-3]|[01]\d):|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s(?:2[0-3]|[01]\d):[0-5]|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s(?:2[0-3]|[01]\d):[0-5]\d|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s(?:2[0-3]|[01]\d):[0-5]\d:|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s(?:2[0-3]|[01]\d):[0-5]\d:[0-5]|
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[0-1])\s(?:2[0-3]|[01]\d):[0-5]\d:[0-5]\d
)
$
~
x

答案 1 :(得分:0)

您可以将其组合以获得2个整体信息块。

增量匹配表单分隔符- - : :
允许/匹配坏段。

最后,您将获得有关表单进度的信息 还有表单段。

您通过捕获组2,4,6,8,10

测试表单的进度

您可以通过组1,3,5,7,9,11

测试日期/时间元素

但是,您只需要测试形式中最大组的元素 进展。

^(?:(?:([0-9]{4})|\d*)(-(?:(0[1-9]|1[0-2])|\d*)(-(?:(0[1-9]|[1-2][0-9]|3[0-1])|\d*)([ ]+(?:(2[0-3]|[01][0-9])|\d*)(:(?:([0-5][0-9])|\d*)(:(?:([0-5][0-9])|\d*))?)?)?)?)?)$

格式化

 ^    
 (?:
      (?:
           ( [0-9]{4} )                          # (1)
        |  \d* 
      )
      (                                     # (2 start)
           -
           (?:
                ( 0 [1-9] | 1 [0-2] )                 # (3)
             |  \d* 
           )
           (                                     # (4 start)
                -
                (?:
                     ( 0 [1-9] | [1-2] [0-9] | 3 [0-1] )   # (5)
                  |  \d* 
                )
                (                                     # (6 start)
                     [ ]+ 
                     (?:
                          ( 2 [0-3] | [01] [0-9] )              # (7)
                       |  \d* 
                     )
                     (                                     # (8 start)
                          :
                          (?:
                               ( [0-5] [0-9] )                       # (9)
                            |  \d* 
                          )
                          (                                     # (10 start)
                               :
                               (?:
                                    ( [0-5] [0-9] )                       # (11)
                                 |  \d* 
                               )
                          )?                                    # (10 end)
                     )?                                    # (8 end)
                )?                                    # (6 end)
           )?                                    # (4 end)
      )?                                    # (2 end)
 )
 $

如果捕获组匹配则进行分段。

答案 2 :(得分:0)

正则表达式不是这样做的方式。

这是一个简单的功能。您使用正确格式的正确日期,从前面删除已输入的字符数,并将其与输入的值相结合,然后检查其是否有效

function validateDate($date)
{
    $fakedate = "2018-02-12 00:55:22";
    $date .= substr($fakedate, strlen($date));
    $format = 'Y-m-d H:i:s';
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

var_dump(validateDate('201')); bool(true)
var_dump(validateDate('201a')); bool(false)
var_dump(validateDate('2018-')); bool(true)
var_dump(validateDate('20189')); bool(false)