2012-09-07 57 views
1
function validateDate($date) 
{ 
    echo $date; 
    //2012-08-24 20:30:00 
    if(preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/', $date) >= 1) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

這總是返回false。我用一個唯一的工具來建立正則表達式,並且它在那裏工作得很好。當我將「/」添加到正則表達式時出現問題。不知何故,PHP似乎需要這些,但我不知道爲什麼,我不知道爲什麼它打破了我的正則表達式。帶工作正則表達式的PHP preg_match

它應該返回TRUE爲某事。像「2012-08-24 20:30:00」和假「asdf2012-08-24 20:30:00asdf」或任何不符合我的正則表達式

在此先感謝!

-----------------------編輯 感謝您的答案!

由於有些用戶指出我的函數在樣本日期「2012-08-24 20:30:00」中返回true。不過,只有當我手動設置$ date ='2012-08-24 20:30:00'時才這樣。如果我使用完全相同的字符串在我的代碼中的其他地方調用函數,它將返回false。有誰知道爲什麼?

----------------------- EDIT2

是啊,對不起,浪費你的時間,它實際上是一些空白已添加到串。在調用我的函數之前在我的日期使用trim()可以得到正確的結果。

感謝大家!

+3

這不是您如何驗證日期。它會允許'9999-99-99'。雖然允許9999年是高瞻遠矚,但我不認爲九十年是一個真正的月份。 –

+2

考慮使用strtotime()或DateTime類而不是那 – Bgi

+0

順便說一句,'/'不是必需的 - 只有一些匹配的表達式分隔符。如果你喜歡,你可以使用'|','〜',甚至是字母數字字符,只要你在末尾匹配它(並且在表達式體中使用相同字符的轉義實例)。 –

回答

12

爲什麼使用正則表達式?使用DateTime類。

function validateDate($date, $format = 'Y-m-d H:i:s') 
{ 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 

您可以使用此功能進行各種日期/時間驗證。示例:

var_dump(validateDate('2012-02-28 12:12:12')); # true 
var_dump(validateDate('2012-02-30 12:12:12')); # false 
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true 
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true 
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false 
var_dump(validateDate('14:50', 'H:i')); # true 
var_dump(validateDate('14:77', 'H:i')); # false 
var_dump(validateDate(14, 'H')); # true 
var_dump(validateDate('14', 'H')); # true 

var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Y-m-d\TH:i:sP')); # true 
# or 
var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true 

var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d M Y H:i:s O')); # true 
# or 
var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true 
var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false 
# ... 
+1

+1。我在我的回答[這裏]中使用了這個(http://stackoverflow.com/a/19271434/1438393)。 :) –

+1

+1。我在我的答案[這裏]中使用了這個(http://stackoverflow.com/a/26531488/1992780)。 :P –

2

這應該更好地工作,並且可以更簡單地寫:

function validateDate($date) 
{ 
    return preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/', $date); 
} 

但是它將返回true以9999-99-99 29:59:59提到其他...

從PHP手冊中,你可以很容易地找到更多的優雅可靠的解決方案,例如(從this comment啓發):

function validateDate($data) 
{ 
    return (date('Y-m-d H:i:s', strtotime($data)) == $data); 
} 
+0

有趣,但不回答問題 – Bgi

+0

我通過嘗試解決主要問題(該函數總是返回false)間接回答。我只是想幫忙;它真的值得downvote? –

+0

現在你已經編輯過,沒有。但在是之前,它確實如此。 「此答案無用」是downvote按鈕的工具提示。並沒有用。現在你編輯了,我同意upvote – Bgi

2

返回true我。試試這個正則表達式來代替:

function validateDate($date) { 
    echo $date; 
    if(!preg_match("/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/",$date,$m)) return false; 
    if(!checkdate($m[1],$m[2],$m[0])) return false; 
    if($m[3] > 23) return false; 
    if($m[4] > 59) return false; 
    if($m[5] > 59) return false; 
    return true; 
} 

這是比較容易驗證的格式在正則表達式,然後確認有針對性的功能內容,而不是試圖和正則表達式做的一切。

+0

感謝您的答案。 其實我的函數返回true時手動設置$ date ='2012-08-24 20:30:00'但它確實返回FALSE當我調用我的代碼中的其他地方與此確切的字符串,任何想法爲什麼? – marius2k12

+0

您確定該字符串在之前或之後沒有空格嗎?甚至不可打印的字符?字符串從哪裏來? –

1

你在問什麼是分隔符。閱讀PHP.net手冊這篇文章:RegExp - Delimiters

當使用PCRE功能,則需要該模式是由定界符封閉。分隔符可以是任何非字母數字,非反斜槓,非空白字符。

和:

常用的分隔符是正斜槓(/),散列符號(#)和波浪號(〜)。以下是有效分隔模式的所有示例。