2012-12-06 24 views
8

私は明らかにfilter_var()を正しく使用していません。ユーザーが「dd/mm/yyyy」の形式で有効な日付を入力したことを確認する必要があります。filter_var()を使用して日付を確認しますか?

$myregex = "/\d{2}\/\d{2}\/\d{4}/"; 
print filter_var("bad 01/02/2012 bad",FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=> $myregex))); 

場合:

これは単に、私はそれが日付またはFALSE/0/nullをいずれかを返すことが期待される一方、ケースに入力された文字列は、日付のようには見えませんが、私は日付として渡されたものを返します誰かがこの機能を使って日付をチェックしていますが、何が間違っていますか?フォームフィールドを検証する別の関数を使用する必要がありますか?

ありがとうございます。あなただけそのパターンどこでも文字列にする必要があるため

答えて

14
$myregex = '~^\d{2}/\d{2}/\d{4}$~'; 

正規表現がマッチしました。あなたが望むのはだけですそのパターンと他に何もありません。したがって、^$を追加してください。

これは、値が有効日であることを意味するわけではありません。 99/99/9999はそのテストに合格します。私が使用したい:

if (!DateTime::createFromFormat('d/m/Y', $string)) 
+1

私のテストによれば、あなたの 'createFromFormat()'条件は '99/99/9999'のような文字列を捕捉しません。しかし、それは 'baddate 'をキャッチします。 – mickmackusa

0

を開始を設定してみて、このようなあなたの正規表現のため終了:日付を検証するために正規表現を使用した

$myregex = "/^\d{2}\/\d{2}\/\d{4}$/"; 
19

は悪い考えです。.. 99/99/9999は簡単として見ることができます想像してみて有効な日付..あなたがすべきcheckdate

bool checkdate (int $month , int $day , int $year) 

簡単な利用法

$date = "01/02/0000"; 
$date = date_parse($date); // or date_parse_from_format("d/m/Y", $date); 
if (checkdate($date['month'], $date['day'], $date['year'])) { 
    // Valid Date 
} 
+0

これを指摘してくれてありがとう+コード。 – Gulbahar

+0

checkdateについて知りませんでした! +1 – rbawaskar

+0

これは、現在受け入れられている回答として設定されているものよりはるかに良い解決策です。 – DHS

2

PHPで日付を確認する簡単で便利な方法は、strtotimeです。あなたが唯一の1行で日付を検証することができ :

strtotime("bad 01/02/2012 bad"); //false 
strtotime("01/02/2012"); //1325455200 unix timestamp 
+0

短い修正のために最適です。しかし、MM/DD/YYYYがDD/MM/YYYYまたは他のタイプのトラップに逆方向に読み込まれるように注意してください。 – Sablefoste

0

あなたは正規表現が99/99/9999の答えを可能に示された回答の多くを受け取りました。これは、RegExにもう少し追加することで解決できます。この形式の日付を検証する

/^(0[1-9]|[12][0-9]|3[01])[/](0[1-9]|1[012])[/](19|20)\d\d$/ 

:DD/MM/YYYY

あなたは年間1900から2099の外の日付を持っていることは決してないだろう知っていれば...あなたは、このように正規表現を使用することができます

の間:01/01/1900 - 31/12/2099

もっと年が必要な場合は、最後に追加してください。 | 21 | 22 | 23 | 24 | 25

1

PHPクラスのネイティブDateTimeがあるのに対し、なぜRegExが重いのですか?

$value = 'badbadbad'; 

try { 
    $datetime = new \DateTime($value); 

    $value = $datetime->format('Y-m-d'); 
} catch(\Exception $e) { 
    // Invalid date 
} 

有効な日時文字列が挿入されている場合は、いつも期待していた形式を返します。

関連する問題