Frage

Was ist die RegEx-Muster für die DateTime (2008-09-01 12:35:45 ) ?

Ich bekomme diese Fehlermeldung:

No ending delimiter '^' found

Verwendung:

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

Gibt diesen Fehler:

Warnung:preg_match() [function.preg-match]:Kompilierung fehlgeschlagen:nichts zu wiederholen, an offset 0 in E:\www\index.php on line 19

War es hilfreich?

Lösung

@Espo:Ich muss nur sagen, dass regex ist unglaublich.Ich würde es hassen zu haben, den code zu schreiben, Tat etwas, das nützliche mit dem übereinstimmt, wie wenn Sie wollte, um wirklich herauszufinden, was Datum und Zeit der Benutzer eingegeben.

Es scheint, wie Tom die Lösung wäre, mehr haltbar ist, da es über eine Million mal einfacher und mit dem Zusatz von ein paar Klammern, die Sie können leicht Holen Sie sich auf die Werte, die der Benutzer eingegeben werden:

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

Wenn Sie mit perl, dann können Sie die Werte mit so etwas wie dieses:

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

Andere Sprachen haben eine ähnliche Funktion.Beachten Sie, dass Sie benötigen, um einige kleinere mods an, die regex-wenn Sie möchten, um die Werte zu übernehmen, wie einstelligen Monaten.

Andere Tipps

Eine einfache version, die die Arbeit für das format erwähnt, nicht aber all die anderen, wie pro @Espos:

(\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})?$


Diese NEU überprüft werden beide Datumsangaben und/oder Male Muster.Tage im Februar.auch validiert für Schaltjahre.Termine:in dd/mm/yyyy oder d/m/yy-format zwischen 1/1/1600 ist - 31/12/9999.Führende Nullen optional sind.Datum Separatoren entweder matching Bindestriche(-), Schrägstrich(/) oder Punkte(.) Zeiten:hh:MM:ss AM/PM 12-Stunden-format (12:00 UHR - 11:59:59 Uhr) oder hh:MM:ss militärische Zeit format (00:00:00 - 23:59:59).12 Stunde Zeit format:1) kann eine die führende null der Stunde.2) Minuten und Sekunden sind optional für die 12 - Stunden-format, 3) AM oder PM ist erforderlich und groß-und Kleinschreibung.Militär-Zeit 1) muss eine führende null für Stunden weniger als 10.2) Minuten manditory.3) Sekunden sind optional.Datetimes:Kombination der oben genannten Formate.Ein Datum zuerst, dann eine Zeit durch ein Leerzeichen getrennt.ex) dd/mm/yyyy hh:MM:ss


Bearbeiten:Stellen Sie sicher, dass Sie kopieren Sie die RegEx vom regexlib.com website StackOverflow manchmal entfernt/zerstört special chars.

^([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)$
$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);

$matches werden:

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

Eine einfache Art zu brechen, eine datetime-Format-string.

in Bezug auf Imran Antwort vom 1. Sep 2008 at 12:33 es fehlt :in der Muster - das richtige Muster

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

zurück

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

Hier ist meine Lösung:

/^(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])\:([012345][0-9])\:([012345][0-9])$/u

Ich habe geändert, die regex-Muster von http://regexlib.com/REDetails.aspx?regexp_id=610.Die folgenden Muster übereinstimmen sollten, zu Ihrem Fall.

^(?=\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

PHP preg-Funktionen braucht Ihre regex gewickelt werden mit einem Trennzeichen, das kann jeder Charakter.Sie können nicht verwenden Sie dieses Trennzeichen ohne Escapezeichen im inneren der regex.Dies sollte funktionieren (hier das Trennzeichen ist /):

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

Wenn Sie anpassen müssen Zeilen enthalten, die ausschließlich datetime, add ^ und $ am Anfang und Ende der regex.

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

Link zum Handbuch von PHP preg_match()

Hier ist eine vereinfachte version (stammt aus Espo Antwort).Es prüft die Richtigkeit des Datums (auch leap-Jahr) und hh:mm:ss ist optional
Beispiele der Arbeit:
- 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})?$

Hier ist meine Lösung:

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization

Debuggex Demo

https://regex101.com/r/lbthaT/4

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top