2010-09-30 43 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); 

乾杯。