2011-05-23 66 views
1

我有文件100S与名称类似:从yyyy-m-dd提取完整日期?

CPC_2001_5_21_7.pdf 
CPC_YYYY_M_DD_7.pdf 

最后一个号码是一个页码和其无关。我想出来整理到像目录:

年月日(即:20010521)

回答

2

您可以提取年,月,日用:

if (preg_match('/^CPC_(\d{4})_(\d{1,2})_(\d{1,2}).*$/', $filename, $matches)) { 
    list($file, $year, $month, $day) = $matches; 
} 
+0

为什么甚至有CPC_部分?忽略这一点并使用'。*'将允许更广泛的范围。另外,你忘了你的分隔符。 – 2011-05-23 19:09:53

+0

当然,如果他们不都是以CPC_开头,那么可以使用'。*'代替。 – rid 2011-05-23 19:10:28

+0

但我需要把它放在名称为yyyymmdd格式的文件夹中 – siliconpi 2011-05-23 19:10:54

0

你应该用下划线分割,然后进行格式化新的文件名使用nullpadding。

<?php 
    $filenames = array(
     "CPC_2001_5_21_7.pdf", 
     "CPC_2002_2_13_7.pdf", 
     "CPC_2004_6_23_7.pdf" 
    ); 
    $newfilenames = array(); 

    foreach($filenames as $filename) 
    { 
     $split = explode("_", $filename); 

     $newfilenames[] = sprintf("%04s%02s%02s", $split[1], $split[2], $split[3]) . ".pdf"; 
    } 

    print_r($newfilenames); 
?> 

输出

Array 
(
    [0] => 20010521.pdf 
    [1] => 20020213.pdf 
    [2] => 20040623.pdf 
) 
2

如果我是你,我会用天上DateTime::createFromFormat。这允许您指定一个模式并从中创建一个DateTime对象。

因此,例如,

$date = 'CPC_2001_5_21_7.pdf'; 
$dt = DateTime::createFromFormat('!*Y_n_d_*.*', $date); 

然后,您可以建立你想要的数据的字符串:

$filename = $dt->format('Ymd') . '.pdf'; 
+0

+1不错,从来不知道那个'createFromFormat'。 – 2011-05-23 19:26:26