2013-05-09 97 views
0

我試圖以匹配PHP的正則表達式特定日期時間格式:正則表達式匹配的日期和時間

dd-mm-YYYY HH:ii:ss 

應該始終處於該格式。也就是說,例如當它是本月的第一天必須有一個前導零。例如: -

01-01-2013 01:01:01 

我用下面的方式試了一下:

^[0-12]{2}-[0-31]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$ 

但像時間戳上面的圖案失敗:09-05-2013 19:45:10

http://rubular.com/r/eGBAhwiNCR

我知道這可能不是以驗證日期時間這樣正確的做法,但我真的想知道什麼是錯的上方。

+3

不能使用具有0和12這樣的數:[0-12]表示0和1之間的所有字符,和字符2.它就像[012] – 2013-05-09 17:54:27

回答

1

問題是,當您檢查「範圍」時,例如[0-12]開頭。這是一個字符類,它告訴正則表達式匹配0到1,然後是2.因此,如果在第一個字符後面添加更多數字,它不會像您期望的那樣工作。稍微改變你的正則表達式(集中在[0-12]初始值),[0-319]{2}-[0-12]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$,將匹配09-01-2011 11:11:10

確保每個空間都有有效的數字,需要在盒子外面進行一點思考。正則表達式:

(0[1-9]|[12][\d]|3[0-2])-(0[1-9]|1[0-2])-[\d]{4} (0[1-9]|1[\d]|2[0-3]):(0[1-9]|[1-5][\d]):(0[1-9]|[1-5][\d])$

會爲你與regex you attempted期待什麼工作。

如果你把它分解成更小的部分它是有道理的(它看起來真的很嚇人)。看第一部分(0-31爲「天」)。

(0[1-9]|[12][\d]|3[0-2])

這是使用一個或者處理3不同的情況。

  1. 0[1-9] - 零之後是1-9之間的任何數字。我們不希望[0-9]{2},因爲這將允許像00這樣的數字。因此,如果一個數字以0開頭,並且後面有任何其他數字(單個數字天),則該數字有效。
  2. [12][\d] - a 1 or 2後跟任意數字。這使得號碼10-29有效。
  3. 3[0-2] - 通過2一個3其次是什麼0匹配303132

分解,它不是太糟糕,但是這個模式然後對你的日期中的每個「字段」執行。所以這個正則表達式驗證每個字段的有效性......但是確定有效日期可能需要更好的方法。 這並沒有涉及到檢查的複雜性,如果你可以有30-02例如,2月沒有30天。

0
^[0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}$ 
+0

這將匹配所有的'0'和數字像'99'的月份。 – Walls 2013-05-09 17:59:44

+0

@牆壁嚴重嗎?你會因此而低估我的?你自己的解決方案不再有效 - 它允許像2月31日這樣的日期。它適當地匹配* pattern *,然後應該將它們輸入到一個PROPER日期檢查器中,而不是試圖用正則表達式來完成。 – 2013-05-09 18:07:48

+0

@牆其他人爲什麼已經給出了很好的答案。我只是給了一些代碼來完成需要的東西。我看不出有什麼理由重複別人的完美答案,只要我能夠提高他們的成績,然後添加他們沒有提出的部分。 – 2013-05-09 18:12:59

7

[0-12]{2}比賽不是數字0直到12。相反,它是一個字符類,允許01以及編號2。隨後的量詞只允許重複那些,重複兩次,重複0,1或2。

你的其他佔位符遵循相同的非功能性的方案。

如果你不能google更好的正則表達式,最好使用\d{2}\d{4}。更妙的是,只使用DateTime驗證格式。

0

驗證的例子是在PHP但正則表達式是標準

/*pass the date you wanna validate as parameter to the function. 
The function returns true if it is valid and false if the date passed is not valid 
*/ 
function DateValid($date){ 
    //format will be fr if the date is in french format and en if the date is in en format 
    $format=''; 
    //regex that tests if the date is in french format or english, if not in one of these two then it is not valid 
    if(preg_match("#^(\d{1,2})[\-./ ](\d{1,2})[\-./ ](\d{4})(?: (\d{1,2})(?:[ .-](\d{1,2})){1,2})?$#",$date,$m)){ 
     $format='fr'; 
    }elseif (preg_match('#^(\d{4})[-. ](\d{1,2})[-. ](\d{1,2})(?: (\d{1,2})(?:[ .-](\d{1,2})){1,2})?$#', $date, $m)) { 
     $format='en'; 
    }else{ 
     echo '<p style="font-size:150px">not english nor french</p>'; 
     return false; 
    } 
    //If it is french format or English then check if the date is correct 
    if($format=='fr'){ 
     if (checkdate($m[2], $m[1], $m[3]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) { 
      echo '<p style="font-size:150px">Not valid french</p>'; 
      return false; 
     }else{ 
      echo '<p style="font-size:150px">Valid french</p>'; 
      return true; 
     } 
    }elseif($format=='en'){ 
     if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) { 
      echo '<p style="font-size:150px">Not valid english</p>'; 
      return false; 
     }else{ 
      echo '<p style="font-size:150px">Valid english</p>'; 
      return true; 
     } 
    } 
}