datetime的正则表达式是什么(2008-09-01 12:35:45)?

时间:2008-09-01 10:58:25

标签: php regex datetime

DateTime的RegEx模式是什么(2008-09-01 12:35:45)?

我收到此错误:

  

找不到结尾分隔符'^'

使用:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

给出了这个错误:

  

警告:preg_match()[function.preg-match]:编译失败:在第19行的E:\ www \ index.php中偏移0处不重复

12 个答案:

答案 0 :(得分:55)

@Espo:我不得不说正则表达式令人难以置信。我不想编写对匹配做有用的代码,例如,如果你想真正找出用户键入的日期和时间。

看起来汤姆的解决方案会更加稳固,因为它简单了几十万倍,并且通过添加一些括号,您可以轻松获得用户输入的值:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

如果您正在使用perl,那么您可以使用以下内容获取值:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

其他语言也具有相似的功能。请注意,如果要接受单位数月份等值,则需要对正则表达式进行一些小的修改。

答案 1 :(得分:22)

一个简单的版本,适用于所提到的格式,但不是所有其他的@Espos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

答案 2 :(得分:7)

http://regexlib.com/REDetails.aspx?regexp_id=610

  

^(= \ d?)(:( ?: 31((?: 0 [2469] | 11))|(?:?!????!?30 | 29)(0 2)| 29(= 0 2(:( :( ?: 1 [6-9] |????[2-9] \ d)(?:0 [48] | [2468] [048] | [ 13579] [26])|(:( ?: 16 | [2468] [048] | [3579] [26])00)))(?:\ X20 | $))|(:2θ[O- 8] | 1 \ d | 0 [1-9]))([ - /])(?: 1 [012] | 0 [1-9])\ 1(?:?1 [6-9] | [2-9] \ d)\ d \ d(:(= \ X20 \ d?)\ X20 | $))(((0 [1-9] | 1 [012]?)(?: [0-5] \ d){0,2}(\ X20 [AP] M))|([01] \ d | 2 [0-3])(:[0-5] \ d){1, 2})?$


  

此RE验证日期和/或   时代模式。 2月的日子也是   经过闰年验证。日期:在   dd / mm / yyyy或d / m / yy格式之间   1/1/1600 - 31/12/9999。领先的零   是可选的。日期分隔符可以是   要么匹配破折号( - ),斜杠(/)   或句点(。)时间:在......中:MM:ss   上午/下午12小时格式(上午12:00 -   晚上11:59:59)或者......:MM:ss军事时间   格式(00:00:00 - 23:59:59)。 12   小时时间格式:1)可能有一个   一小时领先零。 2分钟   和秒是12的可选项   小时格式3)AM或PM是必需的   区分大小写。军事时间1)   所有时间必须有一个前导零   小于10分钟   manditory。 3)秒是可选的。   日期时间:以上的组合   格式。先是一个约会,一个是时间   被空间隔开。 ex)dd / mm / yyyy   HH:MM:SS


编辑:确保从regexlib.com网站复制RegEx,因为StackOverflow有时会删除/销毁特殊字符。

答案 3 :(得分:3)

^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$

答案 4 :(得分:3)

$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$匹配将是:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

分解日期时间格式化字符串的简便方法。

答案 5 :(得分:1)

关于Imran从2008年9月1日12:33回答 有一个缺失:在模式中 正确的模式是

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

返回

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

答案 6 :(得分:0)

这是我的解决方案:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u

答案 7 :(得分:0)

我修改了http://regexlib.com/REDetails.aspx?regexp_id=610的正则表达式模式。以下模式应与您的案例相符。

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

YYYY-MM-DD HH:MM:SS

答案 8 :(得分:0)

添加到@Greg Hewgill答案:如果您希望能够同时匹配日期时间和日期,则可以将正则表达式的“时间”部分设为可选:

(\d{4})-(\d{2})-(\d{2})( (\d{2}):(\d{2}):(\d{2}))?

这样,您将同时匹配2008-09-01 12:35:422008-09-01

答案 9 :(得分:-1)

PHP preg函数需要使用分隔符包装你的正则表达式,分隔符可以是任何字符。如果不在正则表达式内转义,则不能使用此分隔符。这应该工作(这里的分隔符是/):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

如果您需要匹配仅包含日期时间的行,请在正则表达式的开头和结尾添加^和$。

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Link to PHP Manual's preg_match()

答案 10 :(得分:-1)

这是一个简化版本(源自Espo的回答)。它检查日期的正确性(甚至是闰年),并且hh:mm:ss是可选的
工作的例子:
- 2003年12月31日11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

答案 11 :(得分:-1)

这是我的解决方案:

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization

Debuggex Demo

https://regex101.com/r/lbthaT/4