10

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

これは単に日付として渡したものを返しますが、入力文字列が日付のように見えない場合は、日付または0 / null/FALSEのいずれかを返すと期待していました。

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

他の誰かがこの関数を使用して日付をチェックする場合、私は何を間違っていますか?フォームフィールドを検証するために別の関数を使用する必要がありますか?

ありがとうございました。

4

9 に答える 9

26

正規表現を使用して日付を検証することは悪い考えです..想像して99/99/9999みてください。有効な日付として簡単に見ることができます..日付を確認する必要があります

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
}
于 2012-12-06T15:05:03.520 に答える
16
$myregex = '~^\d{2}/\d{2}/\d{4}$~';

文字列のどこかにそのパターンが必要なだけなので、正規表現は一致しました。必要なのはそのパターンだけで、他には何もありません。したがって、とを追加^$ます。

これは、値が有効な日付であることを意味するわけではないことに注意してください。99/99/9999そのテストに合格します。私は使用します:

if (!DateTime::createFromFormat('d/m/Y', $string))
于 2012-12-06T15:02:48.127 に答える
5

PHPで日付を確認する簡単で便利な方法は、strtotime関数です。1行だけで日付を検証できます。

strtotime("bad 01/02/2012 bad"); //false
strtotime("01/02/2012"); //1325455200 unix timestamp
于 2014-09-23T13:35:39.847 に答える
4

ネイティブのDateTimePHPクラスがあるのに、なぜ重い正規表現を使用するのですか?

$value = 'badbadbad';

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

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

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

于 2017-01-19T17:18:44.203 に答える
1

より良い解決策は@babaによって投稿されていますが、投稿されたコードは特定の条件ではうまく機能しません。

たとえば、この日付「2019-12-313」を検証しようとすると、

$date = date_parse("2019-12-313");

関数はこの配列を返します:

Array
(
    [year] => 2019
    [month] => 12
    [day] => 31
    [hour] => 
    [minute] => 
    [second] => 
    [fraction] => 
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 1
    [errors] => Array
        (
            [10] => Unexpected character
        )

    [is_localtime] => 
)

したがって、次のコマンドを実行すると、次のようになります。

checkdate($date['month'], $date['day'], $date['year']);

$date['day']の値は313ではなく31であるため、checkdateは真の値を返します。

このケースを回避するには、次の値にチェックを追加する必要があります。$date['error_count']

@babaの例が更新されました

$date = "2019-12-313";
$date = date_parse($date); // or date_parse_from_format("d/m/Y", $date);
if ($date['error_count'] == 0 && checkdate($date['month'], $date['day'], $date['year'])) {
    // Valid Date
}
于 2019-05-14T09:42:12.113 に答える
1

この機能を使用して日付を確認できます。

function is_date_valid($date, $format = "Y-m-d"){
    $parsed_date = date_parse_from_format($format, $date);
    if(!$parsed_date['error_count'] && !$parsed_date['warning_count']){
        return true;
    }

    return false;
}

それの使い方:

$is_valid = is_date_valid("2021-8-1"); // it will return boolean.

注:2番目のパラメーターでフォーマットを渡すことにより、日付のフォーマットを変更できます。

于 2021-08-13T07:39:24.027 に答える
0

次のように、正規表現の開始と終了を設定してみてください。

$myregex = "/^\d{2}\/\d{2}\/\d{4}$/";
于 2012-12-06T15:04:23.407 に答える
0

$myregex = "~^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$~";

print filter_var("bad 01/02/2012 bad",FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=> $myregex)));
于 2020-08-06T22:32:52.863 に答える
-1

あなたは、正規表現が99/99/9999の回答を許可することを示す多くの回答を受け取りました。これは、正規表現にもう少し追加することで解決できます。1900〜2099年以外の日付がないことがわかっている場合は、次のような正規表現を使用できます。

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

これにより、この形式の日付が検証されます:dd / mm / YYYY

間:1900年1月1日-2099年12月31日

さらに年数が必要な場合は、最後に追加してください。| 21 | 22 | 23 | 24 | 25(2599年まで延長されます。)

于 2015-07-12T20:24:21.470 に答える