我有這個正則表達式(\d{4})-(\d{2})-(\d{2})
來檢測有效日期,但它不是完美的,因爲一些傳入數據是2009年至2009年(YYYY-DD-MM),有些是2009年 - 09-24(YYYY-MM-DD)。更好的正則表達式來驗證日期時間
是否有可能有一個單行正則表達式來檢測第二部分是否大於12以更好地驗證日期?
我有這個正則表達式(\d{4})-(\d{2})-(\d{2})
來檢測有效日期,但它不是完美的,因爲一些傳入數據是2009年至2009年(YYYY-DD-MM),有些是2009年 - 09-24(YYYY-MM-DD)。更好的正則表達式來驗證日期時間
是否有可能有一個單行正則表達式來檢測第二部分是否大於12以更好地驗證日期?
驗證YYYY-MM-DD或YYYY-MM-DD:
$ptn = '/(\d{4})-(?:(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-2])|(0[1-9]|' .
'[1-2][0-9]|3[0-2])-(0[1-9]|1[0-2]))/';
echo preg_match_all($ptn, '2009-24-09 2009-09-24 dd', $m); // returns 2
即使如此,日期可能是無效的,如:2010-02-29
,對付那有checkdate()
:
checkdate(2, 29, 2010); // returns false
如果你不知道格式,你會得到不明確的結果。
需要2010-01-04
是1月4日還是3月1日?
你不能使用正則表達式來驗證它。
正如艾伯特所說,試着解析日期,並確保用戶知道使用哪種格式。您可以嘗試將月份和年份分成不同的字段或組合框。
@Byron - 用戶和腳本之間沒有交互,腳本是解析一堆xml文件等。 – John
(\d{4})-((0[1-9]|1[0-2])-(\d{2}))|((\d{2})-(0[1-9]|1[0-2]))
YYYY-(MM-DD)|(DD-MM)
你的優先規則是錯誤的;該正則表達式匹配'YYYY-MM-DD' **或**'DD-MM'。但是解決這個問題,你仍然留下像'2009-01-02'這樣的日期無法解析的模糊性。 –
正則表達式是這個正確的解決方案?你仍然會有像2月31日那樣的東西進來。 – Jimmy
@Jimmy - 不是一個完美的檢查,但我在另一個組件中進行了另一輪驗證。所以稍微好一點的檢查對於這個特定的功能是有利的。 – John
@Jimmy:你也可以用正則表達式來表達。但那將是一個醜陋的表達。 – Gumbo