我需要匹配日期戳的多个变体
$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);
}
答案 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结合起来,并为每个人编写了一个模式,并将它们与逻辑或者合并在一起。代码非常简单,唯一值得注意的是第二部分中的反向引用,用于允许两个点/无点而不是混合。