2012-03-04 13 views
0

日付と時刻の検証には正規表現が必要です。フォーマットはyyyy-mm-ddThh:mm:ssです。 Tは日時の間の単なる記号です。おかげで助けを日時のPHP正規表現

答えて

3

フルパワーのソリューション:

function validate($str) 
{ 
    preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})$/', $str, $matches); 

    if (count($matches) != 7) 
     return false; 

    $valid_year = range(2000, 2050); // your range 
    $valid_month = range(1, 12); 
    $valid_day = range(1, 31); 
    $valid_hour = range(0, 24); 
    $valid_minute = range(0, 59); 
    $valid_second = range(0, 59); 

    list($str, $year, $month, $day, $hour, $minute, $second) = $matches; 

    foreach(array('year', 'month', 'day', 'hour', 'minute', 'second') as $part) 
    { 
     if (!in_array($$part, ${'valid_'.$part})) 
      return false; 
    } 

    return checkdate($month, $day, $year); // this will reject absurd values like February 30 or April 31 
} 

編集:私はstrtotimeを信用していません。たとえば、「タイムスタンプの有効範囲は、1901年12月13日20:45:54 UTCから2014年1月19日03:14:07 UTCまでです。 (strtotimeマニュアルページから引用)。この範囲外の日付を受け入れる場合はどうすればよいですか?私には、strtotimeは未知のブラックボックスです。私を間違えないでください:私はそれを、最終的に使用します!しかし、私はこのケースではないでしょう。

1

は、日付の正規表現と時間の正規表現との間に文字「T」を入れて、この正規表現を試してみてください:

(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}) 
+0

これは、 '1234-56-78T90:98:76'のようなものを許可するため、最初のステップです。 –

+0

ありがとうございます。検証のもう一つの部分はそれほど問題ではありません。 –

1
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$ 

これは、それが適切な形式でありますようになります。次に、strtotimeのような関数を呼び出して、それが有効なdatetimeであることを確認する必要があります。

1

システムのロケールに応じて、人/アプリケーションの日付文字列が異なる形式で入力されるため、実際には必要ではないと思います。

最も効果的なのは、UNIX_TIMESTAMPを指定された日付から取得し、有効なものであるかどうかを確認することです。

例:

$date1 = "2011-02-23T13:04:41"; 
$date2 = str_replace("T", " ", $date1); // removing the T 
$date3 = strtotime($date2); 

今、あなたはちょうどそれが有効なのですか、あなたに必要な条件を満たしている場合は、元の入力された日付も同様でチェックし、$ date3 ...で動作します。

念のためにあなたは、すべてこの混乱を必要としないで、プレーン行く:時間の値が有効な日付を表す場合、このチェック

(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}) // pseudo - not tested 
1

$t = strtotime($yourTimeString); 

if ($t === FALSE) { 
    // $yourTimeString is not valid. 
} 

確認したい場合は、文字列形式そのものでは、正規表現チェックを使用します。

+0

T文字はどうですか?それはそれを認識しない、私は思います。 – Juvanis

+1

これは、OPが検証したい以外のいくつかの他の形式の日付と時刻を許可します。 –

+0

@deporterです。 http://ideone.com/ApI9Y – Tomalak