• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

PHP regulärer Ausdruck für ein Datum

daWonderer

New member
Hallo,

ich suche einen regulären Ausdruck um einen Datumsstring mit folgendem Format zu prüfen: '2008-12-02+16:53:22'

Mein Ausdruck sieht zur Zeit so aus:

#^
[0-9]{1,4}
[-]?
([0]{0,1}[0-9]?)([1]?[0-2]?)
[-]?
([0-2]{0,1}[0-9]?)([3]?[0-1]?)
[+]?
([0-1]{0,1}[0-9]?)([2]?[0-3]?)
[:]?
[0-5]{0,1}[0-9]?
[:]?
[0-5]{0,1}[0-9]?
$#


Aber irgendwie meint preg_match, dass mit dem gegebenen String was nicht stimmt.

Was ist an meinem Ausdruck falsch?

Danke schon mal für die Hilfe!
 
1. er wird dir schon sagen, was nicht stimmt - das solltest du uns mittelen
2. Zeilenumbrüche sind meines Wissens nach in RegExp nicht erlaubt
3. diese RegExp macht nicht das, was du willst: so passt z.B. "123456789" auf deine RegExp. Was willst du denn genau prüfen? Ob der String genau dieses Format hat? Oder was an welcher Stelle steht?
 
1. er wird dir schon sagen, was nicht stimmt - das solltest du uns mittelen

Nicht der String stimmt nicht sondern das Ergebnis ist nicht das gewünschte.

2. Zeilenumbrüche sind meines Wissens nach in RegExp nicht erlaubt

Ich hatte das hier nur der Übersichtlichkeit wegen so hineingeschrieben.

Was willst du denn genau prüfen? Ob der String genau dieses Format hat?

Der String sollte ein gültiges Datumsformat dieser Form haben.

Ich erkläre mal was ich dabei gedacht habe (bei dem neuen Ausdruck den ich jetzt habe):

#^
[0-9]{1,4} Jahreszahlen 1 bis 4-stellig
[-]
([0]{0,1}[0-9])|([1][0-2]) Monat ein oder zweistellig von 1-12
[-]
([0-2]{0,1}[0-9])|([3][0-1]) Tag ein bis zweistellig von 1-31
[+]
([0-1]{0,1}[0-9])|([2][0-3]) Stunde von 1-23
[:]
[0-5]{0,1}[0-9] Minute von 0-59
[:]
[0-5]{0,1}[0-9] Sekunde von 0-59
$#


EDIT: Ich sehe gerade da sind immer noch Fehler drin. Ich melde mich später noch einmal....
 
einstellige Jahreszahlen? Sind die nicht 2 oder vierstellig?

Nee, bei mir im Script beginnt die Zeitrechnung im Jahr 0 :D

Hatte das Escapen der Sonderzeichen und Klammern nicht beachtet.
Hab jetzt den Ausdruck hier und der scheint zu funktionieren.

#^[0-9]{1,4}\-(([0]{0,1}[0-9])|([1][0-2]))\-(([0-2]{0,1}[0-9])|([3][0-1]))\+(([0-1]{0,1}[0-9])|([2][0-3]))\:[0-5]{0,1}[0-9]\:[0-5]{0,1}[0-9]$#
 
Und was ist mit negativen Jahren?

Das ist eine gute Frage. Da muss ich mich glatt mal informieren wie man ein PHP-Skript schreibt welches Geschichtsdaten mit Datum in einer Datenbank speichern kann die vor unserer Zeitrechnung stattfanden. Wobei da wohl keine genaueren Informationen vorliegen als das Jahr, welches man als String speichern kann.
 
willst du nicht lieber auf ein gültiges Datum prüfen, anstatt auf ein gültiges Format?

Natürlich möchte ich auf ein gültiges Datum prüfen. Allerdings in diesem Format.
Ich hatte strtotime() getestet, jedoch liefert mir diese Funktion auch gültige Timestamps bei völlig widersinnigen Strings welche keinem mir bekannten Datumformat entsprechen. Daher bin ich auf preg_match umgestiegen.

Dazu muss ich sagen, dass die Daten die hier validiert werden aus einer Datenbank kommen und daher auf jeden Fall einem gültigen Wert entsprechen.
Entscheidend ist hier nur das Format.
 
Dazu muss ich sagen, dass die Daten die hier validiert werden aus einer Datenbank kommen und daher auf jeden Fall einem gültigen Wert entsprechen.
Entscheidend ist hier nur das Format.
Dann frage ich mich wozu der reguläre Ausdruck konkret dienen soll? Dir ist klar, dass reguläre Ausdrücke ziemliche Performancekiller sein können?
 
Dann frage ich mich wozu der reguläre Ausdruck konkret dienen soll?

Ist eine Aufgabe die ich derzeit bearbeite. Dass der Wert auf jeden Fall ein gültiger Wert ist stimmte nur in einem bestimmten Fall der Nutzung des Scriptes.
Bei einer anderen Anwendung mit anderen Parametern sind die Werte aus HTML-Formularen und nicht zwangsläufig korrekt.

Dir ist klar, dass reguläre Ausdrücke ziemliche Performancekiller sein können?

Oh, nein das war mir bisher nicht bewusst. Danke für den Hinweis.

Btw: Für die Validierung des Datums verwende ich nun Zend_Date::isDate().
 
Zurück
Oben