2011-08-29 119 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

相关问题