此正则表达式验证时间戳,例如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 |
+------+------+-------+
是否有一个很好的(短)正则表达式扩展?
...
答案 0 :(得分:1)
因为你的问题有javascript标签我会假设你正在做"一步一步"验证像" onkeyup"或类似的。以下模式将验证您的日期时间字符串,因为它正在构建(我将包含空字符串作为有效,以便在空时不触发任何标记;但如果您想要操作,则可以更改为\d{1,4}
空字符串)。
我尽可能使用\d
来减少模式长度。
x
模式修饰符与我的转储模式一起使用,以便于阅读。将此应用到项目时,可以压缩所有内容并删除x
标记。
我习惯使用非捕捉群体;因为你可能只是匹配,所以你可以使用捕获组。
模式:
~
^
(?:
\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)