2010-07-05 22 views
1

有沒有什麼方法可以寫一個正則表達式,它只能在一個日期時間字符串中驗證一種類型的分隔符?RegEx中一個日期時間字符串中的一種分隔符類型

例如,30/04/2010是正確的,但30-04/2010不正確。

我搜索了一些關於回溯的信息,但我不太清楚如何使用它。舉例來說,如果我有這個正則表達式:

(?P<date>((31(?![\.\-\/\—\ \,\–\-]{1,2}(Feb(ruary)?|Apr(il)?|June?|(Sep(?=\b|t)t?|Nov)(ember)?)))|((30|29)(?![\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?))|(29(?=[\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?[\.\-\/\—\ \,\–\-]{1,2}(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))|(0?[1-9])|1\d|2[0-8])[\.\-\/\—\ \,\–\-]{1,2}(Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sep(?=\b|t)t?|Nov|Dec)(ember)?)[\.\-\/\—\ \,\–\-]{1,2}((1[6-9]|[2-9]\d)\d{2}))

那麼我怎麼使用走回頭路嗎?

非常感謝。

+0

你爲什麼要這麼做?讓用戶以任何可以理解的方式輸入日期。 「30-04/2010」顯然是2010年第30個月的第4天,所以你應該接受它。 ;-)幫助用戶,不要打她。 – 2010-07-05 11:10:17

+0

假設我們有這個字符串09/07-10/12。我希望regEx將09/07和10/12作爲兩個日期。否則,09/07-10可能會作爲一個日期不匹配。 – James 2010-07-05 12:19:00

回答

5

不回答你的問題,但你有沒有考慮過使用strtotime()?

它能夠解析任何英文的日期和時間非常靈活的功能:

Feb 2, 2010 
February 2, 2010 
02/02/10 
4 weeks ago 
Next Monday 

如果日期是不可解析,該函數將返回false(或在PHP 5.1之前的-1)。

有幾個問題 - 我想我記得使用xx-xx-xxxx表示法時,它傾向於假定歐洲的DD-MM-YYYY日期 - 但總而言之,您可能比使用正則表達式好得多。

+0

謝謝08/2010如何?我試過,但PHP未能解析這種格式。 \t 假設我們有這個字符串09/07-10/12。我希望regEx將09/07和10/12作爲兩個日期。否則,09/07-10可能會作爲一個日期不匹配。 – James 2010-07-05 12:21:08

+0

@詹姆斯是的,它不能解析'08/2010'(如果有任何幫助,它會正確地處理2010年8月)。但是如果沒有特定的規則集,匹配像'09/07-10/12'這樣的東西將會非常複雜在一個正則表達式中實現。你能否添加更多關於你確切情況的細節?你可以在輸入中加入某種形式嗎? – 2010-07-05 12:24:34

0

您擁有的正則表達式似乎檢查字符串是否爲日期時間可能的任何格式。 如果你只是想檢查給出的例子30/04/2010你可以用這個簡單的例子

([\ d] {1,2})/([\ d] {1,2})/ ([\ d] {2,4})

(日,月1-2位,今年2-4位)

+0

謝謝,但這僅僅是一個例子。 – James 2010-07-05 12:22:18

1

雖然從佩卡更好的答案解決您的問題,我認爲這是值得回答這部分你的問題:

那麼我該如何使用回溯在這裏?

這裏是正則表達式的一個例子匹配 「2010年5月7日」 和 「05/07/2010」,而不是 「05-07/2010」:

"#^\d{2}([/-])\d{2}\1\d{4}$#" 
     ------  -- 

最重要部分正則表達式用下劃線表示; \1這裏是第一個捕獲子模式([/-])的反向引用。您可以在PHP手冊的Back references一章中獲得更多信息。

相關問題