2013-04-30 95 views
0

我需要知道這行代碼的作用,試圖找出它,因爲我必須用preg_match()構建它,但我完全不理解它:需要從ereg()切換到preg_match()

ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})", $date) 

我知道它檢查日期,但我不知道在哪個方式。

感謝您的幫助

+1

0-9的一個或兩個數字,隨後按期。 0-9一個或兩個數字後加句點。 0-9 4位數字。 – 2013-04-30 20:23:38

回答

3

讓我們打破這:

([0-9]{1,2}) 

這到九查找數爲零(-表示範圍在括號[]使用時),並且可以有1個或兩個他們。

. 

這看起來對任何單個字符

([0-9]{1,2}) 

這到九查找數爲零,可以有(再次)是1或兩個人

. 

這看起來對於任何單個字符(再次)

([0-9]{4}) 

這到九查找數爲零,必須有他們的四連勝

所以它是尋找下列任何一種格式的日期:

  • 04 18 1973年
  • 04 -18-1973
  • 1973年4月18日
  • 1973年4月18日

更多,所以它不是一個非常咕將適合該模式d正則表達式它應該驗證什麼。有很多這種格式的matting日期樣例正則表達式模式,所以如果你谷歌它,你將有一個PCRE在任何時間。

+1

請注意,'-'只表示'[]'中的範圍。 – nickb 2013-04-30 20:27:36

+0

謝謝你指出這一點。 ;-) – emjay 2013-04-30 20:37:50

1

看起來它在匹配中幾乎是不可知論的。

您可以將其解釋爲mm.dd.yyyy或dd.mm.yyyy。如果您實際上試圖匹配/驗證日期,我會考慮修改它,因爲00.00.0000可能是匹配項,但在可能的歷史背景之外是無效數據。

編輯:我忘了'。'在這種情況下可以匹配任何字符而不會逃脫。

+0

它也會認爲00x00x0000是一個日期。 – Bart 2013-04-30 20:33:12

+0

對。我想你得到最大的自由來按照你的方式輸入日期。 – asafreedman 2013-04-30 20:38:15

2

這是一個相對簡單的正則表達式(正則表達式)。如果你打算使用正則表達式,那麼我建議花一點時間來學習語法。一個好的學習起點是http://regular-expressions.info

「正則表達式」或「正則表達式」是用於通過字符串搜索模式匹配的語言。有很多方言,大部分很相似,但有一些差異。PHP從ereg()系列函數開始使用一種特定的方言,然後切換到preg_xx()函數使用稍微不同的正則表達式方言。

這兩者在語法上有一些差異,這對學習有幫助,但它們相當小。事實上,對你而言,好消息是這兩種模式非常相似。

除了模式本身之外,您需要知道的唯一其他主要區別是preg_match()中的模式必須在模式字符串的任一端都有一對定界字符。最常用的字符是斜線(/)。

在這種情況下

所以,你需要做的是交換eregpreg_match,和斜線添加到該模式的兩端:

$result = preg_match("/([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})/", $date); 
        ^        ^
        slash here       and here 

它仍然會有助於獲取模式什麼的理解正在做,但爲了快速取勝,這可能是你在這種情況下需要做的所有事情。其他情況可能會更復雜,但大多數情況下會如此簡單。

請閱讀我之前鏈接過的regular-expressions.info網站;它會幫助你。

然而,我要補充的一件事是,這裏給出的模式實際上寫得很差。它打算匹配一個日期字符串,但會匹配很多它可能不想要的內容。

你可以通過尋找一個更好的正則表達式來匹配日期,但是很可能不需要regex就可以編寫代碼 - PHP內置了一些完美的日期處理功能。你需要考慮周圍的代碼,並明白它在做什麼,但它是完全有可能的是,整個事情可以像這樣的東西來代替:

​​
+0

真的很棒!感謝您的發佈。我會看看這個網站。 :) – emjay 2013-04-30 21:10:24

1

這個做同樣的,我只更換[0 -9]通過\ d,點(即匹配全部)由\ d(非數字,但可以通過\替換它。或[.-])

preg_match("~\d{2}\D\d{2}\D\d{4}~", $date) 
+0

謝謝,會嘗試。 :) – emjay 2013-04-30 21:08:08