2009-12-05 70 views
0

我相對比較新的正則表達式,但我設法創建一個工作表達式來驗證日期(沒有閏年,並假設人們輸入一個月的有效30或31位數字)。PHP動態正則表達式?

這是快報: /^\d[1-31]{2}\-\d[1-12]{2}\-\d[1900-2009]{4}$/

但我想有一個動態的正則表達式,如:

$yearSpan = (date("Y") - 110)."-".date("Y"); 
/^\d[1-31]{2}\-\d[1-12]{2}\-\d[$yearSpan]{4}$/ 

當我嘗試用這句話就一直告訴我的編譯失敗,因爲在字符類中出現錯誤。

我使用這個表達式來驗證出生日期,並且它不會在每年經過一次時更新它。

有什麼建議嗎?

回答

3

做到這一點,我認爲你應該考慮使用一些日期/時間函數用於此目的。

您正在以錯誤的方式使用字符類。 [1-31],[1-12][1900-2009]不會檢查您在其中的範圍。這不是如何character classes工作,因此這不是你如何檢查numeric ranges與正則表達式。

字符類[a-r]ar之間的任何字符匹配。 [a-rx]匹配從ar和字符x中的任何字符。同樣,[1-39]可以匹配13之間的任何字符以及字符9 - 因此它與1,2,3和9中的一個相匹配 - 而不是您想要的1-39中的任何數字。

[1-31]{2}匹配兩個連續的數字(最後一個是冗餘的),都在1到3的範圍內 - 33是有效匹配。

要匹配從1到31的數字,正確的正則表達式是0?[1-9]|[1-2][0-9]|3[0-1]。 (「?0」照顧零填充的爲01-09-2009

幾個月:0?[1-9]|1[0-2]

對於一年:19[0-9]{2}|200[0-9]

而且-不字符類之外的元字符 - 你不需要逃避它。

正確的正則表達式是:

/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/ 

如果您是n ot有興趣獲取的價值觀,你可以把它寫爲:

/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/ 
+0

謝謝你明確的答案!我將使用Rimian提到的checkdate函數。 – Ben 2009-12-06 11:59:46