Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php regexp-匹配多个不同的日期戳_Php_Regex - Fatal编程技术网

Php regexp-匹配多个不同的日期戳

Php regexp-匹配多个不同的日期戳,php,regex,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|1

我需要匹配一个邮戳的多个变体

$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);
}
$test=array(
'01-05-2011',
'01-05-11',
'01.12.2012',
'30042016'
);
$date|u day|u模式='01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 28 | 31 |;
$date|u year|u pattern='(?:20)?10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30';

$date_pattern=“(?我已经编写了一个应该可以工作的模式。它看起来与您的略有不同,但与您在其中描述的每个案例都匹配,并且在任何其他情况下都会失败

'(?:(?: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))'
解释

我结合了案例1和案例2以及案例3和案例4,为每一个案例编写了一个模式,并将它们与逻辑or合并在一起。代码非常简单,唯一值得注意的是第二部分中的反向引用,用于允许两个点/无点,而不是混合。这个缩短的正则表达式应该适用于您的示例:

$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);
}

您应该考虑使用日期解析功能,如代码> StotoTime/CODE >进行正确的日期验证和解析。 输出:

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
)

2010-2030年或2029/2039年可以吗?前导零是必需的还是可选的?您的代码到底有什么问题?上面的代码有什么问题?它与日-月-年不匹配。不要使用正则表达式执行此操作。通过
strottime()
new DateTime()将每个字符串转换为时间戳
然后比较转换后的值。输出来自OCR,因此输入字符串不仅仅是日期。您的代码允许点/无点混合,因此类似10.102012的数据将匹配。日期格式错误,因为“-”要求“月日”,而点要求“日.月”。确定它已更新为不允许连字符/点/无点混合然而,正如我所建议的那样,真正的日期解析例程是要去的,否则它也会验证31-02-2017作为有效日期。@拉法尔伯特没关系。草堆来自OCR,所以分隔符可能是任何东西。甚至是一个被误解的查拉,那是真的。@克拉克:在这种情况下,你可以考虑<代码> /\b(0 [1-9],[12 ] [09] 3(01))。(\W?)(0[1-9]| 1[0-2])\2((?:20)?(?:[12][0-9]| 30))\b/“