3
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はこれらを必要としているようですが、私には理由がわかりません。また、なぜ正規表現が壊れているのかわかりません。

sthに対してTRUEを返す必要があります。「2012-08-2420:30:00」のように、「asdf2012-08-24 20:30:00 asdf」の場合はFALSE、または私の正規表現に従わないものはすべて

前もって感謝します!

-----------------------編集すべての回答ありがとうございます!

一部のユーザーが指摘したように、私の関数はサンプル日付「2012-08-2420:30:00」に対してtrueを返します。ただし、これは、$ date ='2012-08-2420:30:00'を手動で設定した場合にのみ行われます。まったく同じ文字列を使用してコードの他の場所で関数を呼び出すと、falseが返されます。誰かが理由を知っていますか?

-----------------------編集2

時間を無駄にしてすみません。実際、文字列に追加されたのは空白でした。関数を呼び出す前に日付にtrim()を使用すると、正しい結果が得られます。

みんな、ありがとう!

4

3 に答える 3

23

なぜ正規表現を使用するのですか?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
# ...
于 2012-09-07T17:50:46.327 に答える
3

私のために戻ります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;
}

RegExですべてを試してみるよりも、RegExでフォーマットを検証してから、対象となる関数でコンテンツを検証する方が簡単です。

于 2012-09-07T17:44:58.640 に答える
2

あなたが求めているのは区切り文字です。PHP.netのマニュアルでこの記事を読んでください:RegExp-区切り文字

PCRE関数を使用する場合は、パターンを区切り文字で囲む必要があります。区切り文字には、英数字、円記号、空白以外の任意の文字を使用できます。

と:

よく使用される区切り文字は、スラッシュ(/)、ハッシュ記号(#)、チルダ(〜)です。以下は、有効な区切りパターンのすべての例です。

于 2012-09-07T17:48:27.000 に答える