Datetime regex desen (2008-09-01 00:35:45) nedir?

7 Cevap php

DateTime için RegEx desen (2008-09-01 00:35:45) nedir?

Ben bu hatayı alıyorum:

Hayır biten ayraç '^' bulundu

Kullanımı:

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');

Bu hatayı veriyor:

Uyarı: preg_match () [function.preg-match]: Derleme başarısız oldu: yinelenecek şey E 0 offset: 19 hattı üzerinde \ www \ index.php

7 Cevap

@ Espo: Ben sadece regex inanılmaz olduğunu söylemek gerekir. Ben böyle aslında kullanıcının ne yazdığınız tarih ve saati öğrenmek istedim sanki maçları, işe yarar bir şey yaptım kod yazmak zorunda nefret ediyorum.

Tom'un çözüm daha savunulabilir olacak gibi yaklaşık yüz kere daha basit ve bazı parantez eklenmesi ile kolayca kullanıcı yazdığınız değerleri almak gibi görünüyor:

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

Eğer perl kullanarak iseniz, o zaman böyle bir şey değerlerini alabilirsiniz:

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

Diğer diller benzer bir yeteneğe sahip olacak. Böyle tek haneli ay gibi değerleri kabul etmek isterseniz regex için bazı küçük mods yapmak gerektiğini unutmayın.

Belirtilen biçimi için çalışmak değil, tüm diğerleri gibi @ Espos başına olacak basit bir versiyonu:

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

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


Edit: StackOverflow bazen özel karakter yok / kaldırır gibi regexlib.com web sitesinden RegEx aldığınızdan emin olun.

regarding to Imran answer from Sep 1th 2008 at 12:33 there is a missing : in the pattern the correct patterns are

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 );

Bu döner

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 
$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);

$ Karşılaşmalar olacak:

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

Bir datetime format dize kadar kırmak için kolay bir yoldur.

PHP gebelik fonksiyonları herhangi bir karakter olabilir bir ayraç karakteri ile sarılmış olması için regex gerekiyor. Sen regex içine kaçan olmadan bu ayraç karakteri kullanamazsınız. Bu işe (burada ayraç karakteri / bir) olmalıdır:

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');

Sadece datetime içeren satırları maç gerekiyorsa, ^ ekleyin ve $ regex başında ve sonunda.

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()