2011-10-10 52 views
0

因此,出於我所有的PHP技能,我只是吮吸正則表達式。我完全理解它的概念,但我不能很好地寫出我的模式。那麼我需要他們從文件路徑中提取日期信息。這是我的代碼:preg_match php,形成圖案

#example path 
$path='/Users/landonsilla/Desktop/HS Pilot Project/Archive/Cabinet/Documents/2006-11In/Car Park/AR190298.doc'; 

echo $path."\n\n"; 
$pattern1 = '/[0-9]{4}[0-9]{2}[0-9]{2}/';#match YYYYMMDD 
$pattern2 = '/[0-9]{4} [0-9]{2} [0-9]{2}/';#match YYYY MM DD 
$pattern3 = '/[0-9]{4}[-][0-9]{2}/';#match YYYY-MM 
$pattern4 = '/20[0-9]{2}/';#match YYYY 

if(preg_match($pattern1, $path, $matches)){ 
    $ret=$matches[0].'-'.$matches[1].'-'.$matches[2].' 00:00:00'; 
} 
else if(preg_match($pattern2, $path, $matches)){ 
    $ret=$matches[0].'-'.$matches[1].'-'.$matches[2].' 00:00:00'; 
} 
else if(preg_match($pattern3, $path, $matches)){ 
    $ret=$matches[0].'-'.$matches[1].'-01 00:00:00'; 
} 
else if(preg_match($pattern4, $path, $matches)){ 
    $ret=$matches[0].'-01-01 00:00:00'; 
} 
else{ 
    $ret=date ("Y-m-d H:i:s.", filemtime($path)); 
} 

$ pattern1,2,3,4變量不起作用。有人可以讓我知道如何改變這些變量,以便我可以以標準(mysql)格式結束$ ret的日期嗎?

+0

對於您使用的匹配項,您沒有任何組。 'var_dump()'是你的朋友,從測試文件中的單個模式開始,進行調試直到你得到結果。 – hakre

+1

http://rubular.com是一個很棒的測試工具。 – deceze

+0

以及我正在使用print_r()(在這種情況下var_dump相同的東西),但我似乎無法從一個函數調用 – Landon

回答

1

首先,您需要使用()對子模式進行分組。這將按照您的假設將結果存儲在matches[]陣列中。進一步更多的比賽存儲在索引1和上,所以你需要加1到你的if/else中的每個匹配。

$path='/Users/landonsilla/Desktop/HS Pilot Project/Archive/Cabinet/Documents/2002-11In/Car Park/AR190298.doc'; 

echo $path."\n\n"; 
$pattern1 = '/([0-9]{4})([0-9]{2})([0-9]{2})/';#match YYYYMMDD 
$pattern2 = '/([0-9]{4})([0-9]{2})([0-9]{2})/';#match YYYY MM DD 
$pattern3 = '/([0-9]{4})[-]([0-9]{2})/';#match YYYY-MM 
$pattern4 = '/(20[0-9]{2})/';#match YYYY 

if(preg_match($pattern1, $path, $matches)){ 
    $ret=$matches[1].'-'.$matches[2].'-'.$matches[3].' 00:00:00'; 
} 
else if(preg_match($pattern2, $path, $matches)){ 
    $ret=$matches[1].'-'.$matches[2].'-'.$matches[3].' 00:00:00'; 
} 
else if(preg_match($pattern3, $path, $matches)){ 
    $ret=$matches[1].'*-*'.$matches[2].'-01 00:00:00'; 
} 
else if(preg_match($pattern4, $path, $matches)){ 
    $ret=$matches[1].'-01-01 00:00:00'; 
} 
else{ 
    $ret=date ("Y-m-d H:i:s.", filemtime($path)); 
} 

結果可以在here上查看。

+0

太棒了!這正是我想要的,我看起來像我很接近,我只是不知道與parens分組和結果數組中的額外偏移。 – Landon