2010-09-30 46 views
4

我想使用的preg_match匹配PHP中的日期,把它分解并分配它的部分到一个数组,该日期看起来像“20100930”,这里是我使用的代码:的preg_match约会

// Make the tor_from date look nicer 
$nice_from = $_POST['tor_from']; 

$matches = array(); 
$ideal_from = ''; 
preg_match('/\d{4}\\d{2}\\d{2}\/', $nice_from, $matches, PREG_OFFSET_CAPTURE, 0); 
// if (isset($matches[0])) $nice_from = $matches[0]; 
echo $matches[0]; 
echo "<br />"; 
echo $matches[1]; 
echo "<br />"; 
echo $matches[2]; 
echo "<br />"; 
echo $matches[3]; 
echo "<br />"; 

我一直在使用: http://php.net/manual/en/function.preg-match.phpPHP preg_match question来阐述如何做到这一点的想法,但我没有得到它的工作运气。任何帮助将不胜感激。

回答

1

如果模式很简单,那么正则表达式并不是最好的方法。使用substr代替:

$date = '20100930'; 
$year = substr($date,0,4); 
$month = substr($date,4,2); 
$day = substr($date,6,2); 
+0

谢谢!这工作得很好,对于像我这样的人来说很简单! – imbadatjquery 2010-09-30 20:24:58

+0

这也不回答问题,也不检查日期是否由数字组成。 – j4k3 2016-01-22 09:38:41

0

你需要在你想要在$matches中显示的模式周围放一些括号。我也不认为你想要在你的\d之间的双重\\,因为这将跳过第二个\,并让你匹配一个文字'd'

7

尽管正则表达式并不是真正的解析YYYYMMDD格式日期的好方法,但让我们通过为什么模式不起作用。

你的模式\d{4}\\d{2}\\d{2}\说:“比赛4个位数(\d{4}),后面跟着一个反斜杠字符(\\),其次是字母d两次(d{2}),其次是另一个反斜杠(\\),最后另外两个d's(d{2})“。

正如您现在可能已经弄清楚的那样,您不需要双斜杠!

\d{4}\d{2}\d{2} 

将匹配4位数字,接着2位,然后另一个2位数字。

此外,你没有指定任何capturing groups,所以你的子模式将永远不会被填充。你可能意思是:

(\d{4})(\d{2})(\d{2}) 

看到这个行动在http://www.ideone.com/iAy7K。请注意,在您的情况下确实没有任何理由指定PREG_OFFSET_CAPTURE标志(返回每个匹配的位置)或0作为偏移量。

3

忘记的preg_match,使用的strtotime():

echo date('Y/m/d', strtotime($_POST['tor_from'])); 
+0

+1 strtotime定期令我惊叹,它会接受什么。但是,如果您需要单独的零件,此解决方案不太有用。 – lonesomeday 2010-09-30 20:29:07

+0

只需将strtotime的输出分配给一个变量,那么您可以使用date('Y',$ date)来获取年份,日期('m',$ date)来获取月份等。 – 2010-09-30 20:31:41

+0

这就是很多处理将字符串拆分为三部分... – 2010-09-30 20:34:13

3

是这样的好,用的preg_match和索引的名字。

$res = preg_match("/(?P<year>[0-9]{4})(?P<month>[0-9]{2})(?P<day>[0-9]{2})/", $date, $matches); 

和火柴的样子:,

array('year' => 2010, 'month' => 12, 'day' => 07); 

干杯。