2009-07-02 111 views
2

中回覆^我無法完全理解^在preg_match中正在做什麼。Preg Match ^在php

if (preg_match('~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~', trim($date), $dateParts)) { 
    echo the $dateparts and do some magic with them 
} else { 
    tell me the date is formatted wrong 
} 

依我之見,這是想看看是否在$日期,我讀出 4小數格式相匹配 - 1或2位小數 - 1或2位小數

如果它不匹配,那麼IF語句顯示日期,如果沒有,則會給出錯誤的日期格式錯誤。

然而,只是通過它的一年 $ date ='1977'沒有別的(沒有日期或月)它仍然通過爲真,並顯示日期部分,我會認爲它會拋出一個錯誤?

有人能指出我在正則表達式中缺少的東西嗎?我猜這是^或可能是最後的?$可能意味着只匹配它的一部分?

+0

等於http://stackoverflow.com/questions/938100/tilde-operator-in-regular-expressions? – l0b0 2009-07-02 11:30:19

回答

3

有沒有必要組絕對一切。這看起來更好,並會做相同的:

preg_match('~^\d{4}(-\d{1,2}(-\d{1,2})?)?$~', trim($date), $dateParts) 

這也解釋了爲什麼「1977」被接受 - 的月份和日期部分是可選(問號使得一些可選)。

要做到你所說的( 「4個小數 - 1或2位小數 - 1或2位小數」),您需要同時刪除可選組:

preg_match('~^\d{4}-\d{1,2}-\d{1,2}$~', trim($date), $dateParts) 

的 「^」 和 「$」與你所看到的問題無關。它們只是字符串開頭和字符串結尾的錨點,確保沒有其他比在檢查的字符串中描述的模式。將它們關閉並且"blah 1977-01-01 blah"將開始匹配。

+2

這很好地回答了我的問題,並指出了我遇到的具體問題。 – 2009-07-02 11:50:52

+0

你剛剛被授予正確的答案,有4個非常好的其他答案,但我覺得你在我想做的事情上幫助了我最多。從來沒有這樣一個良好的迴應,不確定是誰給予'成功'的答案也是一個很好的問題:) – 2009-07-02 11:55:05

2

試試這個:

'~^(\d\d\d\d)-(\d{1,2})-(\d{1,2})$~' 

的問題是在正則表達式中允許的月份和日期作爲可選用「?」字符。

+1

感謝您的快速和明確的迴應。 – 2009-07-02 11:53:51

2

^$錨分別在傳遞的字符串的你的圖案的起點和終點。該?是乘法器,匹配0或前圖形的1(在這種情況下,parenthesised位)。

您的模式匹配一​​年,一年和一個月,或一年,一個月和一個日期;如果你遵循括號,你會看到最後的?在一年後的整個模式周圍的parens上運行。

^ # beginning of string 
    (\d\d\d\d) #year 
    (
     -(\d{1,2}) #month after a dash 
     (
      -(\d{1,2}) #date after a dash 
     )? #date optional 
    )? # month and date optional 
$ # end of string 
+1

謝謝你的分解,也幫了我很多。 – 2009-07-02 11:51:49

2

好吧,讓我們打破了這個爲你:

  • 「〜^(\ d \ d \ d \ d)( - (\ d {1,2})( - (\ d { '})?)?$〜'
  • - 開頭和結尾都是RegExp-delimiters,所以它們不是真正的正則表達式的一部分。
  • ^ - 均值「這是行的開頭」
    • 避免了字符串中間相匹配,和主持人它,這樣的字符串的開頭必須匹配
  • (\ d \ d \ d \ d) - 比賽(和捕獲)四位數字,而不是可有可無的
    • 這也可以寫成\ d {4}
  • ( - (\ d {1,2})( - (\ d {1,2}))?)? - 匹配(並捕獲)可選組。
    • 它說,如果這種組存在,它必須是一個破折號,後面跟着一個或兩個數字(天或月),其次是一個破折號,後面跟着一個或兩個數字(天或月)
  • $ - 意味着字符串的結尾,所以在字符串的開頭加上^表示整個字符串必須與正則表達式匹配。

什麼這個正則表達式匹配的一些例子:

  • 1982年8月11日
  • 1982-30-01
  • 8127-99-52

一些例子那將不符合:

  • 82-08-11
  • 2009-10

正如你可以看到,這個正則表達式將接受是不是真的有效日期,一些「日期」,所以我可能會通過某種帶有日期運行處理功能也是如此,如strtotime