php时间正则表达式,php-日期时间的正则表达式模式是什么(2008-09-01 12:35:45)?...

php-日期时间的正则表达式模式是什么(2008-09-01 12:35:45)?

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

我收到此错误:

找不到结尾的定界符“ ^”

使用:

preg_match('(?n:^(?=\d)((?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])(?[/.-])(?0?[1-9]|1[012])\2(?(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?((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处无重复

11个解决方案

58 votes

@Espo:我只需要说正则表达式是不可思议的。 我讨厌不得不编写对匹配有用的代码,例如您是否想真正找出用户键入的日期和时间。

汤姆(Tom)的解决方案似乎更可靠,因为它简单了大约十亿倍,并且加上一些括号,您可以轻松获得用户输入的值:

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

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

Greg Hewgill answered 2020-07-02T19:58:00Z

22 votes

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

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

Tom answered 2020-07-02T19:58:20Z

7 votes

[HTTP://热歌心里不.com/Re details.aspx?Re个XP_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}) $

此RE验证日期和/或日期 时间模式。 2月的日子也是 经过验证的years年。 日期: dd / mm / yyyy或d / m / yy格式,介于 1/1/1600-31/12/9999。 前导零 是可选的。 日期分隔符可以是 匹配破折号(-),斜杠(/) 或句点(。)时间:在hh:MM:ss中 AM / PM 12小时格式(12:00 AM- 11:59:59 PM)或hh:MM:ss军事时间 格式(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有时会删除/破坏特殊字符。

Espo answered 2020-07-02T19:58:55Z

3 votes

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

Javad Yousefi answered 2020-07-02T19:59:11Z

3 votes

$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

)

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

Philip answered 2020-07-02T19:59:35Z

1 votes

关于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 )

deni answered 2020-07-02T19:59:59Z

0 votes

这是我的解决方案:

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

Tornike answered 2020-07-02T20:00:19Z

0 votes

我已经从[http://regexlib.com/REDetails.aspx?regexp_id=610。]修改了正则表达式模式。以下模式应符合您的情况。

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?

YYYY-MM-DD HH:MM:SS

themepark answered 2020-07-02T20:00:43Z

-1 votes

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()

Imran answered 2020-07-02T20:01:12Z

-1 votes

这是一个简化的版本(源自Espo的答案)。 它检查日期(偶数leap年)的正确性,并且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})?$

Duc Tran answered 2020-07-02T20:01:45Z

-1 votes

这是我的解决方案:

[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

39LWCacr76aGZfCN.png

Debuggex演示

[HTTPS://热个性101.com/日/lb that/4]

Yeongjun Kim answered 2020-07-02T20:02:14Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值