RegEx中一个日期时间字符串中的一种分隔符

时间:2010-07-05 10:21:39

标签: php regex datetime date delimiter

有没有办法编写一个只能在一个日期时间字符串中验证一种分隔符的正则表达式?

例如,30/04/2010是正确的,但30-04 / 2010不正确。

我用Google搜索并发现了一些关于回溯的内容,但我不太确定如何使用它。例如,如果我有这个正则表达式:

(?P<date>((31(?![\.\-\/\—\ \,\–\-]{1,2}(Feb(ruary)?|Apr(il)?|June?|(Sep(?=\b|t)t?|Nov)(ember)?)))|((30|29)(?![\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?))|(29(?=[\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?[\.\-\/\—\ \,\–\-]{1,2}(((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])[\.\-\/\—\ \,\–\-]{1,2}(Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sep(?=\b|t)t?|Nov|Dec)(ember)?)[\.\-\/\—\ \,\–\-]{1,2}((1[6-9]|[2-9]\d)\d{2}))

那我该如何在这里使用回溯?

非常感谢。

3 个答案:

答案 0 :(得分:5)

不是您问题的答案,但您是否考虑过使用strtotime()?

这是一个非常灵活的功能,能够解析任何英语日期和时间:

Feb 2, 2010
February 2, 2010
02/02/10
4 weeks ago
Next Monday

如果日期不可解析,该函数将返回false(或PHP 5.1之前的-1)。

有一些陷阱 - 我想我记得在使用xx-xx-xxxx符号时,它倾向于假设一个欧洲DD-MM-YYYY日期 - 但总而言之,你可能会比使用它更好一个正则表达式。

答案 1 :(得分:1)

尽管Pekka的回答更好地解决了您的问题,但我认为值得回答您的问题的这一部分:

  

那我该如何在这里使用回溯?

以下是匹配“05-07-2010”和“05/07/2010”的正则表达式示例,但不是“05-07 / 2010”:

"#^\d{2}([/-])\d{2}\1\d{4}$#"
        ------     --

正则表达式中最重要的部分有下划线; \1这是第一个捕获子模式([/-])的后向引用。您可以在PHP手册的Back references章节中获得更多信息。

答案 2 :(得分:0)

你有的正则表达式似乎检查字符串是否是日期时间可能的任何格式。 如果您只想查看给定的示例30/04/2010,您可以使用这个简单的

([\ d] {1,2})/([\ d] {1,2})/([\ d] {2,4})

(日期和月份1-2位数字,年份2-4位数字)