regexp - 匹配datestamp的多个变体

时间:2016-08-03 17:03:45

标签: php regex

我需要匹配日期戳的多个变体

$test = array(
    '01-05-2011',
    '01-05-11',
    '01.12.2012',
    '30042016'
);

$date_day_pattern = '01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31';
$date_year_pattern = '(?:20)?10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30';

$date_pattern = "(?<!\d)($date_day_pattern)[^\d\n]?($date_day_pattern)[^\d\n]?($date_year_pattern)(?!\d)";
foreach($test as $input){
    preg_match("/$date_pattern/", $input, $matches);
    print_r($matches);
}

http://www.tehplayground.com/#R1sjJxFho

2 个答案:

答案 0 :(得分:2)

这个缩短的正则表达式适用于您的示例:

$test = array(
    '01-05-2011',
    '01-05-11',
    '01.12.2012',
    '30042016'
);

$date_pattern =
   '/\b(0[1-9]|[12][0-9]|3[01])([.-]?)(0[1-9]|1[0-2])\2((?:20)?(?:[12][0-9]|30))\b/';

foreach($test as $input){
   echo $input."\n";
   preg_match($date_pattern, $input, $matches); print_r($matches);
}

虽然您应该考虑使用strtotime之类的日期解析函数来进行正确的日期验证和解析。

<强>输出:

01-05-2011
Array
(
    [0] => 01-05-2011
    [1] => 01
    [2] => 05
    [3] => 2011
)
01-05-11
Array
(
    [0] => 01-05-11
    [1] => 01
    [2] => 05
    [3] => 11
)
01.12.2012
Array
(
    [0] => 01.12.2012
    [1] => 01
    [2] => 12
    [3] => 2012
)
30042016
Array
(
    [0] => 30042016
    [1] => 30
    [2] => 04
    [3] => 2016
)

答案 1 :(得分:1)

我写了一个应该有效的模式。它看起来与你的略有不同,但是匹配你在那里描述的每一个案例,并且在任何其他情况下都会失败。

'(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[01])-(?:20)?(?:[1-2][0-9]|30))|(?:(?:0[1-9]|[1-2][0-9]|3[[01]])(\.?)(?:0[1-9]|1[0-2])(\1)20(?:[1-2][0-9]|30))'

解释
我已将case1&amp; 2和case3&amp; 4结合起来,并为每个人编写了一个模式,并将它们与逻辑或者合并在一起。代码非常简单,唯一值得注意的是第二部分中的反向引用,用于允许两个点/无点而不是混合。