Preg_match为日期

时间:2010-09-30 20:14:24

标签: php regex date split preg-match

我正在尝试使用preg_match匹配PHP中的日期,将其拆分并将其部分分配给数组,日期看起来像“20100930”,这是我正在使用的代码:

// 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制定了如何做到这一点的想法,但是我没有运气让它发挥作用。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:7)

虽然正则表达式对于解析YYYYMMDD格式的日期来说并不是一个很好的解决方案,但让我们来看看为什么你的模式不起作用。

您的模式\d{4}\\d{2}\\d{2}\说:“匹配4位数(\d{4}),后跟反斜杠字符(\\),然后字母d 两次(d{2}),然后是另一个反斜杠(\\),最后是另外两个反对(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的偏移量。

答案 1 :(得分:3)

忘记preg_match,使用strtotime():

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

答案 2 :(得分: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);

干杯。

答案 3 :(得分:1)

如果模式很简单,正则表达式不是最好的方法。请改用substr

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

答案 4 :(得分:0)

您需要在$matches中想要显示的模式周围加上一些括号。此外,我认为您不希望在\\之间使用双\d,因为这会逃脱第二个\并让您匹配文字'd'