我正在尝试使用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.php和PHP preg_match question制定了如何做到这一点的想法,但是我没有运气让它发挥作用。任何帮助将不胜感激。
答案 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'
。