2011-08-29 116 views
2

我有日期格式字符串將含有Y,M和D.例如,某些格式可能是:從一組匹配的匹配的第一個字符

YY-MM-DD 
M-D-Y G 
MM/Y/DD 
(etc) 

我想上運行一個正則表達式匹配像這樣的字符串並依次提取Y,M,D。例如,在上面的,我想有:

array('Y', 'M', 'D'); 
array('M', 'D', 'Y'); 
array('M', 'Y', 'D'); 
(etc) 

我寫了這個正則表達式expresion:

/(m+)|(d+)|(y+)/ 

但問題是,它返回整場比賽,而不是第一個字符像所以:

array('YY', 'MM', 'DD'); 
array('M', 'D', 'Y'); 
array('MM', 'Y', 'D'); 
(etc) 

如何編寫我的表達式,以便它只返回第一個字符?

編輯:一些代碼(真的沒什麼複雜的)。

$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD'); 

foreach($dates as $date){ 
    preg_match_all('/(m+)|(d+)|(y+)/', strtolower($date), $matches); 
    var_dump($matches); 
} 

回答

1

在我看來就像/\b[ymd]/是所有你需要:

$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD'); 

foreach($dates as $date){ 
    preg_match_all('/\b[ymd]/', strtolower($date), $matches); 
    var_dump($matches); 
} 

編輯:這裏有一個處理年月日以及:

/(?<!y)y|(?<!m)m|(?<!d)d/ 

輸出:

array(1) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(1) "y" 
    [1]=> 
    string(1) "m" 
    [2]=> 
    string(1) "d" 
    } 
} 
array(1) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(1) "m" 
    [1]=> 
    string(1) "d" 
    [2]=> 
    string(1) "y" 
    } 
} 
array(1) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(1) "m" 
    [1]=> 
    string(1) "y" 
    [2]=> 
    string(1) "d" 
    } 
} 
+0

這工作得很好,但是如果格式是YYYYMMDD,它不起作用。 – F21

+0

好的,請參閱我的編輯。 –

+0

完美!正是我需要的。謝謝你的幫助 :) – F21

1

我不擅長正則表達式。但下面的代碼可以解決你的問題,直到你找到一個更好的正則表達式字符串。

$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD'); 
$result = array(); 

foreach($dates as $date){ 
    preg_match_all('/([m])[mdy]?|([d])[mdy]?|([y])[mdy]?/i', $date, $matches); 

    $tmp = array(); 
    for($i=1;$i<=3;$i++){ 
     foreach($matches[$i] as $m){ 
      if(!empty($m)){ 
       $tmp[] = $m; 
       break; 
      } 
     } 
    } 
    $result[] = $tmp; 
} 
+0

爲你+1,但我寧願選擇在正則表達式第一個字符。 :) – F21

+0

這也將匹配空字符串,可以造成很大的麻煩 – Dani

0

我覺得這個比較好:用正則表達式收集第一個字母。但是我認爲在M,D,Y之間只能出現「 - 」,「/」和「\」字符。如果您需要,您可以添加更多。

$dates = array('YY-MM-DD', 'M-D-Y G', 'MM/Y/DD'); 
$result = array(); 

foreach($dates as $date){ 

    preg_match_all('/([mdy])[a-z0-9\ \-\/\\\]?/i', $date, $matches); 
    $result[] = $matches[1]; 

} 
+0

正則表達式似乎有一個錯誤,當我嘗試在正則表達式的朋友。 – F21

0

試着讓你的正則表達式是這樣的:

/(m)m*|(d)d*|(y)y*/ 

它將只捕獲的第一個字母,但允許更多。

+0

是否有可能改變它,使它只捕獲第一個而不允許更多? – F21

相關問題