2010-01-15 122 views
1

我有這個正則表達式(\d{4})-(\d{2})-(\d{2})來檢測有效日期,但它不是完美的,因爲一些傳入數據是2009年至2009年(YYYY-DD-MM),有些是2009年 - 09-24(YYYY-MM-DD)。更好的正則表達式來驗證日期時間

是否有可能有一個單行正則表達式來檢測第二部分是否大於12以更好地驗證日期?

+1

正則表達式是這個正確的解決方案?你仍然會有像2月31日那樣的東西進來。 – Jimmy

+0

@Jimmy - 不是一個完美的檢查,但我在另一個組件中進行了另一輪驗證。所以稍微好一點的檢查對於這個特定的功能是有利的。 – John

+0

@Jimmy:你也可以用正則表達式來表達。但那將是一個醜陋的表達。 – Gumbo

回答

2

正則表達式在日期驗證方面並不是很好,在我看來,最好是試着解析日期,並且在解析它之前可以保持正則表達式爲完整性檢查。

但是,如果你仍然需要它,你可以使用以下正則表達式修復月份部分(\d{4})-(\d{2})-((1[012])|(0\d)|\d),但是之後它會下降,因爲你需要檢查幾個月和閏年的正確日期。

+0

@AlberEin - 同意,稍後我會再檢查一次,在這一點上我只需要一個弱點(但稍好一點)。 – John

+0

如果您稍後再進行其他檢查,那麼什麼值是「弱檢查」? – gary

0

驗證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 
7

如果你不知道格式,你會得到不明確的結果。

需要2010-01-04是1月4日還是3月1日?

你不能使用正則表達式來驗證它。

正如艾伯特所說,試着解析日期,並確保用戶知道使用哪種格式。您可以嘗試將月份和年份分成不同的字段或組合框。

+0

@Byron - 用戶和腳本之間沒有交互,腳本是解析一堆xml文件等。 – John

0
(\d{4})-((0[1-9]|1[0-2])-(\d{2}))|((\d{2})-(0[1-9]|1[0-2])) 

YYYY-(MM-DD)|(DD-MM)

+0

你的優先規則是錯誤的;該正則表達式匹配'YYYY-MM-DD' **或**'DD-MM'。但是解決這個問題,你仍然留下像'2009-01-02'這樣的日期無法解析的模糊性。 –