web-dev-qa-db-ja.com

MM / DD / YYYY正規表現とは何ですか?また、PHPでどのように使用しますか?

MM/DD/YYYYの正規表現は http://www.regular-expressions.info/regexbuddy/datemmddyyyy.html で見つかりましたが、正しく使用しているとは思いません。

ここに私のコードがあります:

$date_regex = '(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';  
} else {
  echo 'this date is not formatted correctly';  
}

これを実行すると、「この日付は正しくフォーマットされていません」と反響するはずです。この正規表現をPHPで設定するにはどうすればよいですか?

22
zeckdude

問題は、デリミタとエスケープ文字の1つです(他の人が述べたように)。これは動作します:

$date_regex = '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';
} else {
  echo 'this date is not formatted correctly';
}

式の最初と最後にスラッシュを追加し、パターン内のスラッシュを(バックスラッシュで)エスケープしていることに注意してください。

さらに一歩先を行くために、このパターンは年を適切に抽出しません...ちょうど世紀。それを/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)/に変更する必要があります(以下で指摘するように)(文字列全体が(サブセットではなく)一致することを確認したい場合は、/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)$/


他の人が言及したように、日付を取得しようとしている場合は、 strtotime() がより良いオプションである可能性があります。一般的に使用されるほとんどすべての形式を解析でき、Unixタイムスタンプを提供します。次のように使用できます。

$test_date = '03/22/2010';

// get the unix timestamp for the date
$timestamp = strtorime($test_date);

// now you can get the date fields back out with one of the normal date/time functions. example:
$date_array = getdate($timestamp);
echo 'the month is: ' . $date_array['month'];    
45
Jeremy Logan

おそらく、人間が読めるほぼすべての日付形式をUNIXタイムスタンプに変換するstrtotime()を使用する方が良いでしょう。 - http://php.net/manual/en/function.strtotime.php

5
DCD

パターンの周りに 正しい区切り文字 が必要です。

$date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~';
5
fuxia

checkdate() 関数も使用できます。正規表現は必要ありません。

$str="03/22/2010";
list($mth,$day,$yr)=explode("/",$str);
var_dump(checkdate($mth,$day,$yr));
3
ghostdog74

質問の著者の正規表現はほぼ正しいです。パターンは次のようにする必要があるため、日付は検証されません。

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

または空想する場合:

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

このパターンは、日付の形式と個々の日付要素の最大/最小値のみをチェックすることに注意してください。つまり、ユーザーのエントリは、JavaScript関数やサーバーで日付の有効性をチェックする必要があります(たとえば、1年がうるう年でない場合、2月29日は許可されません)。

補足として、1桁(1か月分)を許可する場合は、月の部分を

([0-9]|0[1-9]|1[012])

説明:
[0-9]-0〜9の1桁
または
0 [1-9]-01〜09の2桁
または
1 [012]-2桁は10、11、12に制限されています

3
azakgaim

これは、MM/DD/1960からMM/DD/2014までの有効な日付をチェックします

M/D/YYYY0M/0D/YYYYなどの日付も受け入れます

^(?:[1-9]|0[1-9]|1[0-2])/(?:[0-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])/(?:20[6-9][0-9]|20[0-1][0-4])$
1
user1494459

この正規表現を使用してPHPコードの日付を検証するには、PHP preg関数が必要とするように、追加の正規表現区切り文字を含む文字列として正しくフォーマットする必要があります。また、文字列全体に正規表現を一致させるためにアンカーを追加する必要があります(または一致しない場合)。

$date_regex = '%\A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d\z%'; 

$test_date = '03/22/2010'; 
if(preg_match($date_regex, $test_date)) { 
  echo 'this date is formatted correctly';   
} else { 
  echo 'this date is not formatted correctly';   
} 

もちろん、この状況ではライブラリー呼び出しの方が良いでしょう。正規表現では、2月31日などの無効な日付が許可されます。

正規表現は、日付の文字列をスキャンする場合に役立ちます。その場合、アンカーは必要ありません。無効な日付を除外するには、追加のチェックが必要になる場合があります。これは、入力に有効な日付のみが含まれているかどうかによって異なります。

1
Jan Goyvaerts

正規表現には区切り文字が必要です:

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

0
Amy B

ストリングtimeStamp = "03/11/2018 17:51:45";

private static Pattern TIMESTAMP_PATTERN = Pattern.compile( "(0?[1-9] | 1 [012])/(0?[1-9] | [1-2] [0-9] | 3 [0-1] ])/ "+"([1-9] [0-9] {3})([0-1]?[0-9] | 2 [0-3]):([0-5]?[ 0-9]):([0-5]?[0-9]) ");

private static boolean isTimeStampValid(String timeStamp) {
        boolean isFeb = timeStamp.split("/")[0].matches("(0?[2])");
        if (isFeb) {
            boolean isValidFebDate = timeStamp.split("/")[1].matches("(0?[1-9]|1[1-9]|2[0-8])");
            if (!isValidFebDate) return false;
        }
        return TIMESTAMP_PATTERN.matcher(timeStamp).matches();
    }
0
Yoga Gowda