2011-02-17 135 views
2

我想通過使用正則表達式驗證日期輸入。Php正則表達式日期驗證

if(!preg_match("/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/", $_POST['variant']['sales_start'])) { 
    echo "invalid"; 
} 

我想輸入的字符串是2011-02-03,但是它的失敗,我似乎無法找出原因。

有人可以告訴我我做錯了什麼嗎?

在此先感謝

回答

5

你分離與破折號日期和正則表達式尋找斜線?

嘗試

if (!preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/", $_POST['variant']['sales_start'])) 
{ 
    echo "invalid"; 
} 
+0

如何在正則表達式中使用破折號而不是斜槓? – Kristian 2011-02-17 17:28:46

4

您還沒有允許其他分隔除了/,但我也注意到你的正則表達式將使之類的東西9999/99/99。嘗試這樣的:

"/^(?:20|19)[0-9]{2}([-.\\/])(?:0?[1-9]|1[012])\\1(?:0?[1-9]|[12][0-9]|3[01])$/" 

這並不完美,但它非常接近。這將允許任何操作:

  • 1999年10月29日
  • 2011-1-13
  • 2013年6月5日

將禁止以下內容:

  • 1999/10.29
  • 2011-6/20
  • 9090-76-56
  • 0000.00.00

仔細檢查[-.\\/]一部分;這幾天我不習慣PHP,所以我不確定你是否需要\\

1

大廈從Justin的答案,我想添加過濾文本格式的日期。

允許:

  • 2014年3月13日
  • 1940年10月11日
  • 1910七月
  • 2000年9月10日
  • 2010年1月17日
  • 十一分之二十零/ 1999

"#^(((?:0?[1-9]|1[012])|(?:0?[1-9]|[12][0-9]|3[01])|([a-zA-Z]+))([.,]?[-.\\\/\s]))?(((?:0?[1-9]|1[012])|(?:0?[1-9]|[12][0-9]|3[01])|([a-zA-Z]+))([.,]?[-.\\\/\s]))?((?:20|19)[0-9]{2})$#" 

我已經在這個解決方案限制了幾年19XX和20XX,但可以修改,如果需要的。我也不會讓年份處於第一位,因爲它不是典型的用戶格式。另外,如果你打算在JS中使用它,一定要刪除兩個分開的段中額外的'\'轉義。 (我發現PHP需要'/'在JS沒有的地方逃脫)