2008-09-01 21 views
34

DateTimeのRegExパターンとは何ですか(2008-09-01 12:35:45)?datetimeの正規表現パターンは何ですか(2008-09-01 12:35:45)?

私はこのエラーを取得する:使用

No ending delimiter '^' found

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45'); 

は、このエラーを与える:

Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 in E:\www\index.php on line 19

答えて

42

@Espo:私はちょうど正規表現が信じられないほどであることを言わなければなりません。あなたが実際に入力した日時を実際に知りたい場合など、マッチに役立つ何かをしたコードを書く必要はありません。

それは単純で、簡単にユーザーが入力した値で取得することができますいくつかの括弧を加えて膨大な数の倍程度であるとして、トムのソリューションは、より多くの批判に耐えられるだろうように思える:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}) 

あなたが」 perlを使用すると、次のような値で値を取得できます。

$year = $1; 
$month = $2; 
$day = $3; 
$hour = $4; 
$minute = $5; 
$second = $6; 

他の言語も同様の機能を持ちます。 1桁の月などの値を受け入れる場合は、正規表現にマイナーな改造を加える必要があることに注意してください。

+3

この正規表現は、日付、月、時間のいずれかが優れているかどうかを検出しません最大1つまでたとえば2012-65-65 99:99:99が動作します。それ以外は正規表現は素晴らしいです! – darkheir

+0

これは日付を検証するのには不向きだと同意します –

+1

示された正規表現は日付を検証するためのものではありません。文字列の*構文*をチェックして、日付のように見えるかどうかを調べることを意図しています。値を取得したら、通常の日付ライブラリ関数を使用して、指定した日付を検証できます。 –

6

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$


This RE validates both dates and/or times patterns. Days in Feb. are also validated for Leap years. Dates: in dd/mm/yyyy or d/m/yy format between 1/1/1600 - 31/12/9999. Leading zeroes are optional. Date separators can be either matching dashes(-), slashes(/) or periods(.) Times: in the hh:MM:ss AM/PM 12 hour format (12:00 AM - 11:59:59 PM) or hh:MM:ss military time format (00:00:00 - 23:59:59). The 12 hour time format: 1) may have a leading zero for the hour. 2) Minutes and seconds are optional for the 12 hour format 3) AM or PM is required and case sensitive. Military time 1) must have a leading zero for all hours less than 10. 2) Minutes are manditory. 3) seconds are optional. Datetimes: combination of the above formats. A date first then a time separated by a space. ex) dd/mm/yyyy hh:MM:ss


編集:StackOverflowのは時々/特別な文字を削除または破棄してregexlib.comのウェブサイトから必ず正規表現をコピーしてください。

+0

この答えは、良い正規表現ではなく、actuall質問に対する答えを提供します。問題は、この回答が示すように、 " - "で区切られた日付と "/"ではない日付を検証することです。 –

21

シンプル述べた形式のために働くバージョンではなく、他のすべて@Esposあたりとして:

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

に加えて、最も単純なソリューション! – chiliNUT

+0

0000-00-00 00:00:00と0000-00-00 00:00(\ d {4}) - (\ d {2}) - (\ d {2})(\ d (\ d {2}))(\ d {2})) – iRector

-1

PHP preg関数は正規表現文字を任意の文字にすることができる正規表現を必要とします。正規表現の中でエスケープせずにこの区切り文字を使うことはできません。これは、(ここで区切り文字が/で)動作するはずです:

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45'); 

// or this, to allow matching 0:00:00 time too. 
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45'); 

あなたが正規表現の最初と最後に^と$を追加し、唯一の日時を含む行を一致させる必要がある場合。イムランの答えに係る

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45'); 

Link to PHP Manual's preg_match()

0

12時33 での9月の1回目の2008年からの行方不明があります:パターンで 正しいパターンが

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1); 
print_r($m1); 
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2); 
print_r($m2); 
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3); 
print_r($m3); 

あり、これは

を返します。
Array ([0] => 2008-09-01 12:35:45) 
Array ([0] => 2008-09-01 12:35:45) 
Array ([0] => 2008-09-01 12:35:45) 
1
^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$ 
3
$date = "2014-04-01 12:00:00"; 

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches); 

print_r($matches); 

$試合は次のようになります。

Array ( 
    [0] => 2014-04-01 12:00:00 
    [1] => 2014 
    [2] => 04 
    [3] => 01 
    [4] => 12 
    [5] => 00 
    [6] => 00 
) 

日時フォーマットされた文字列を分割する簡単な方法。

-1

ここでは簡略化されたバージョンです(Espoの回答に由来)。これは、日付の正しさ(でも、うるう年)をチェックし、HH:MM:仕事ssはオプションです
例:
- 31/12/2003 11時59分59秒
- 29-2-2004

ここで
^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$ 
0

は私のソリューションです:ここでは

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([][0-9])\:([][0-9])$/u 
0

私はhttp://regexlib.com/REDetails.aspx?regexp_id=610から正規表現パターンを変更しました。次のパターンは、あなたのケースに一致する必要があります。

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$ 

YYYY-MM-DD HH:MM:SS