DateTime (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() [函数.preg-match]:编译失败:第 19 行 E:\www\index.php 中偏移量 0 处没有任何内容可重复

有帮助吗?

解决方案

@埃斯波:我不得不说正则表达式是不可思议的。我不想编写对匹配进行有用操作的代码,例如,如果您想实际找出用户输入的日期和时间。

汤姆的解决方案似乎更站得住脚,因为它简单了无数倍,并且通过添加一些括号,您可以轻松获取用户输入的值:

(\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;

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

其他提示

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

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

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[0-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}) ?$


这重新验证了日期和/或时间模式。二月的日子也经过leap年的验证。日期:在1/1/1600-1600-12/9999之间的DD/mm/yyyy或D/M/YY格式中。领先的零是可选的。日期分离器可以是匹配破折号( - ),斜线(/)或期间(。)时间:在HH:MM:SS AM/PM 12小时格式(12:00 AM -11:59:59 PM)或HH:MM:SS军事时间格式(00:00:00:00-23:59:59)。12小时的时间格式:1)可能在小时内领先零。2)12小时格式的分钟和秒是可选的3)AM或PM需要且对病例敏感。军事时间1)必须在所有小时少于10的时间内将零带零。2)分钟是授权。3) 秒是可选的。日期时间:上述格式的组合。首先是日期,然后由空间分开的时间。例如)DD/MM/YYYY HH:MM:SS


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

^([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)$
$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);

$matches 将是:

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

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

关于2008年9月1日从12:33回答的Imran答复。在模式中,正确的模式是

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 ) 

这是我的解决方案:

/^(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

我已经修改了正则表达式模式 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})?$

年-月-日 时:分:秒

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');

链接到 PHP 手册的 preg_match()

这是一个简化版本(源自 Espo 的答案)。它检查日期的正确性(甚至闰年),并且 hh:mm:ss 是可选的
有效的例子:
- 31/12/2003 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})?$

这是我的解决方案:

[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

调试演示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top