2017-06-14 87 views
1

我需要在php中驗證精確的日期格式。如何驗證日期而不用在日期和月份中導致零?

在我的情況下,最佳日期格式應該是:例如1/1/2017(沒有前導零),代碼應該允許我避免日期格式的其餘部分。

下面的代碼是我寫的,但沒有結果:

if(preg_match("/([1-9]|[1-2][0-9]|3[0-1]-([1-9]|1[0-2])-^[0-9]{4})$/", $date){ 
    // insert into etc. etc.... 
}else{ 
    // update etc. etc.... 
} 

的問題是,該代碼不正確驗證的日期;它接受各種日期格式。

+2

請參閱['date_parse_from_format()'](http://php.net/manual/en/function.date-parse-from-format.php)。 –

+0

或['strptime()'](http://php.net/manual/en/function.strptime.php)。 –

+1

當然,你可以使用正則表達式來做到這一點。另一方面,你也可以使用正則表達式來解析整個DOM樹,這並不意味着你應該這樣做。 – apokryfos

回答

1

我注意到OP的提交的答案並不是防彈的,所以我開始研究一些在這個問題下的評論中提到的一些功能,我自己的想法

我同意apokryfos在使用正則表達式來驗證日期表達式不是最好的公關actice。一個純粹的正則表達式解決方案將變得越來越冗長和越來越難理解的模式,因爲它必須在過去和未來都要考慮閏年。出於這個原因,我調查了一些PHP提供的日期函數。

  1. date_parse_from_format()如Alex Howansky所建議的。不幸的是,它不會是這種情況下的獨立的解決方案,因爲format參數服從語法/的DateTime::createFromFormat()規則:

enter image description here

瞭解如何dj組合在一起,因爲是mn。因此,這個函數會捕獲無效的日期,但不是不需要的前導零。如Casimir和Hippolyte所建議的那樣,可以使用以下物質:

  1. strptime()。此功能使用%e提供沒有前導零的匹配日期。此功能沒有匹配非零前導月份數的字符。此外,基於操作系統的功能可能會出現打嗝。

  2. check_date()似乎是一個合乎邏輯的選擇,但它也不會退縮在零主導的數字。此外,此功能需要比其他更多的數據準備,因爲它需要將月,日和年的值個性化。

  3. if(!DateTime::createFromFormat('j/n/Y', $date))由deceze建議關於a slightly different scenario在這種情況下不起作用。 createFromFormat()將會竭盡全力構建一個有效的日期 - 即使像99/99/9999這樣的字符串也能通過。


在試圖打造最簡潔的表達,這裏是我可以作爲一個看似防彈解決方案使用DateTime類提供:

if (($d=DateTime::createFromFormat('n/j/Y',$date)) && $date==$d->format('n/j/Y')){ 
    // valid 
}else{ 
    // invalid 
} 

strtotime()可以搭配這種情況下的單一條件,因爲OP的日期格式使用斜線作爲分隔符,並且此函數將正確分析日期表達式「美式風格」。

這似乎是檢查有效日期沒有前導零的最簡單的方法:Demo Link

if(date('n/j/Y',strtotime($date))==$date){ 
    // valid 
}else{ 
    // invalid 
} 

如果你正在處理的日期時間表達式,不希望檢查時間部分,你可以有條件線之前調用這行:

$date=explode(' ',$date)[0]; // trim time from datetime expressions 

Demo Link

2

您的日期分隔符是/,而不是-,所以加\/到的正則表達式/。而在正則表達式的開始使用^

if(preg_match("/^([1-9]|[1-2][0-9]|3[0-1])\/([1-9]|1[0-2])\/([0-9]{4})$/", $date){ 
0

幾個小時後,我終於找到了正確的答案。 PHP的正確方式是使用單引號('),而不是雙引號(「),例如:

preg_match('/^([1-9]|[1-2][0-9]|3[0-1])\/([1-9]|1[0-2])\/([0-9]{4})/',$date) 

這工作得很好,我...謝謝大家尤其是@Mohammad HAMEDANI「事業的表達正確但是f ****** g的引用讓我變得瘋狂了

+0

對呀,我要去改變綠色的勾號;)。並且非常感謝您的完整答案 –

相關問題