Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
PHP Prüfen, Datum korrekte Formatierung?
- Ersteller Dsimon24
- Erstellt am
Hugo Stiglitz
Ensign
- Registriert
- Aug. 2015
- Beiträge
- 191
mit preg_match und regex..... :-)
so in etwa:
so in etwa:
PHP:
<?php
$test = "2019-10-31";
$reg = "/^([0-9+]{4})-([0-9+]{2})-([0-9+]{2})$/";
if(preg_match($reg,$test,$match)) {
if(checkdate($match[2],$match[3],$match[1])) {
echo "Das Datum $test ist im richtigen Format und gültig.";
} else echo "Das Datum $test ist ungültig.";
} else echo "Datumsformat falsch. YYYY-MM-DD";
Zuletzt bearbeitet:
(Code geändert!)
Haggis
Lieutenant
- Registriert
- Juni 2017
- Beiträge
- 946
Mit Regex ist das sehr aufwändig.
Das hier ist recht elegant und sicher:
Zum Rumfummeln am Code kann man ganz gut das hier nehmen: http://phptester.net/
Das hier ist recht elegant und sicher:
Code:
function test_date($datestr){
list($y, $m, $d) = array_pad(explode('-', $datestr, 3), 3, 0);
return ctype_digit("$y$m$d") && checkdate($m, $d, $y);
}
//Beispiele zum testen
var_dump( test_date("2019-02-30"));//false
var_dump( test_date("2019-02-27"));//true
Zum Rumfummeln am Code kann man ganz gut das hier nehmen: http://phptester.net/
Sparta8
Lieutenant
- Registriert
- Juli 2008
- Beiträge
- 977
Ich würds mit der Datetime Klasse machen.
Schau dir mal das hier an: https://www.php.net/manual/en/datetime.createfromformat.php
Liefert FALSE zurück, falls aus dem Inhalt deiner Variablen kein Datum erstellt werden konnte.
Schau dir mal das hier an: https://www.php.net/manual/en/datetime.createfromformat.php
Liefert FALSE zurück, falls aus dem Inhalt deiner Variablen kein Datum erstellt werden konnte.
Hugo Stiglitz
Ensign
- Registriert
- Aug. 2015
- Beiträge
- 191
Hier nochmal das Selbe wie oben, nur etwas praktischer:
PHP:
$test = "2019-10-31";
$reg = "/^([0-9+]{4})-([0-9+]{2})-([0-9+]{2})$/";
if(preg_match($reg,$test,$match) && checkdate($match[2],$match[3],$match[1])) echo "valid";
else echo "invalid";
@Hugo Stiglitz
Das "+"-Zeichen in deinen Zeichengruppen ist unnötig bzw. kann sogar dafür sorgen, dass fehlerhafte Eingaben als korrekt eingestuft werden.
Das "+"-Zeichen in deinen Zeichengruppen ist unnötig bzw. kann sogar dafür sorgen, dass fehlerhafte Eingaben als korrekt eingestuft werden.
Hugo Stiglitz
Ensign
- Registriert
- Aug. 2015
- Beiträge
- 191
dann halt ohne +
habe das nur im schnellverfahren gemacht 🙂
habe das nur im schnellverfahren gemacht 🙂
Also der sinnvolle regexp ausdruck dazu lautet ja so:
Mit Gruppen im regexp zu arbeiten ist unnötig, man schaut einfach ob der string zum obigen regexp passt.
Wenn das Format in diesem spezifischen Format eingegeben werden soll ist regexp der mit abstand sinnigste weg. Außerdem ziemlich simpel, wie man sieht.
^\d{4}-\d{2}-\d{2}$
Mit Gruppen im regexp zu arbeiten ist unnötig, man schaut einfach ob der string zum obigen regexp passt.
Wenn das Format in diesem spezifischen Format eingegeben werden soll ist regexp der mit abstand sinnigste weg. Außerdem ziemlich simpel, wie man sieht.
Fusion.Tio
Cadet 2nd Year Pro
- Registriert
- Dez. 2015
- Beiträge
- 31
BeBur schrieb:Also der sinnvolle regexp ausdruck dazu lautet ja so:^\d{4}-\d{2}-\d{2}$
Würde aber dazu führen, dass 9999-99-99 als gültig anerkannt wird.
Das Format wäre natürlich gültig, das Datum allerdings nicht.
Ich würde den Weg von @Sparta8 befürworten mittels der DateTime-Klasse zu realisieren.
Absolut korrekt. Falls man (warum auch immer) ein bestimmtes Format bei der Eingabe erzwingen will könnte man das allerdings mit einem regexp kombinieren.Fusion.Tio schrieb:Würde aber dazu führen, dass 9999-99-99 als gültig anerkannt wird.
Das Format wäre natürlich gültig, das Datum allerdings nicht.
Ich würde den Weg von @Sparta8 befürworten mittels der DateTime-Klasse zu realisieren.
Haggis
Lieutenant
- Registriert
- Juni 2017
- Beiträge
- 946
Nein. Der RegExp alleine reicht nicht.BeBur schrieb:Also der sinnvolle regexp ausdruck dazu lautet ja so:^\d{4}-\d{2}-\d{2}$
Mit Gruppen im regexp zu arbeiten ist unnötig, man schaut einfach ob der string zum obigen regexp passt.
Wenn das Format in diesem spezifischen Format eingegeben werden soll ist regexp der mit abstand sinnigste weg. Außerdem ziemlich simpel, wie man sieht.
Du brauchst die Gruppen um die drei Parameter für checkdate angeben zu können.
Ohne checkdate würde er zum Beispiel ein 2019-99-99 fressen. Oder noch schwieriger: 2019-02-29
Hugo Stiglitz
Ensign
- Registriert
- Aug. 2015
- Beiträge
- 191
Haggis schrieb:Nein. Der RegExp alleine reicht nicht.
Du brauchst die Gruppen um die drei Parameter für checkdate angeben zu können.
Ohne checkdate würde er zum Beispiel ein 2019-99-99 fressen. Oder noch schwieriger: 2019-02-29
deshalb hab ichs ja kombiniert...
Haggis
Lieutenant
- Registriert
- Juni 2017
- Beiträge
- 946
genauHugo Stiglitz schrieb:deshalb hab ichs ja kombiniert...
Aber wie genau?Fusion.Tio schrieb:Ich würde den Weg von @Sparta8 befürworten mittels der DateTime-Klasse zu realisieren.
Wenn man das einfach nur benutzt, kriegt man z.B. aus einem 30.2. einfach den 3. März.
Fusion.Tio
Cadet 2nd Year Pro
- Registriert
- Dez. 2015
- Beiträge
- 31
Haggis schrieb:Aber wie genau?
Wenn man das einfach nur benutzt, kriegt man z.B. aus einem 30.2. einfach den 3. März.
Interessanter Punkt..
Dachte nicht, dass er das einfach so ausspuckt.

da scheint wirklich nur die Kombi aus RegEx und checkdate zu helfen.
Zuletzt bearbeitet:
Hugo Stiglitz
Ensign
- Registriert
- Aug. 2015
- Beiträge
- 191
Was ist den an RegEx und checkdate so verkehrt? Ich finde, dass ist eine solide Lösung.....
Fusion.Tio
Cadet 2nd Year Pro
- Registriert
- Dez. 2015
- Beiträge
- 31
Verkehrt ist daran nichts.
Die DateTime-Funktion wäre meiner Meinung nach eleganter gewesen.
Da die Funktion aber einfach den "Überhang" an Monaten oder Tagen, einfach dazu addiert, ist die Lösung mit RegEx und checkdate die beste.
Die DateTime-Funktion wäre meiner Meinung nach eleganter gewesen.
Da die Funktion aber einfach den "Überhang" an Monaten oder Tagen, einfach dazu addiert, ist die Lösung mit RegEx und checkdate die beste.
chorn
Ensign
- Registriert
- Feb. 2008
- Beiträge
- 171
Was soll denn der Quatsch mit dem Regex? Ein Datum hat kein regelmäßiges Format, schon allein wegen Schaltjahren. Nimm checkdate() wenn dir die Datumsteile vorliegen, oder strtotime(), das liefert auch ggf. false zurück und kann noch weit mehr Formate.
Haggis
Lieutenant
- Registriert
- Juni 2017
- Beiträge
- 946
Hugo nimmt regex weil er die Datumsteile haben will.chorn schrieb:Was soll denn der Quatsch mit dem Regex? Ein Datum hat kein regelmäßiges Format, schon allein wegen Schaltjahren. Nimm checkdate() wenn dir die Datumsteile vorliegen
Strtotime ist da sicher keine gute Idee. Eben weil es alle möglichen Formate zu erraten versucht.chorn schrieb:oder strtotime(), das liefert auch ggf. false zurück und kann noch weit mehr Formate.
Es liefert Dir zum Beispiel bei "2000" oder "2000-1" einen Wert. Oder auch bei unserem Klassiker "2019-02-30"
Ähnliche Themen
- Antworten
- 5
- Aufrufe
- 915
- Antworten
- 12
- Aufrufe
- 3.192
- Antworten
- 5
- Aufrufe
- 1.484
- Antworten
- 13
- Aufrufe
- 14.298