Ich versuche zu überprüfen, ob die von Endbenutzern eingegebenen Daten im JJJJ-MM-TT enthalten sind. Regex war noch nie meine Stärke. Ich erhalte immer wieder einen falschen Rückgabewert für das von mir eingerichtete preg_match ().
Ich gehe also davon aus, dass ich den unten beschriebenen regulären Ausdruck durcheinander gebracht habe.
$date="2012-09-12";
if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
{
return true;
}else{
return false;
}
Irgendwelche Gedanken?
php
regex
date-format
cosmicsafari
quelle
quelle
date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";
oder PHPscheckdate ( int $month , int $day , int $year )
.Antworten:
Versuche dies.
quelle
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
Es ist wahrscheinlich besser, dafür einen anderen Mechanismus zu verwenden.
Die moderne Lösung mit
DateTime
:Dies validiert auch die Eingabe:
$dt !== false
stellt sicher, dass das Datum mit dem angegebenen Format analysiert werden kann, und derarray_sum
Trick ist eine knappe Methode, um sicherzustellen, dass PHP keine "Monatsverschiebung" durchgeführt hat (z. B. wenn man bedenkt, dass der 32. Januar der 1. Februar ist). SieheDateTime::getLastErrors()
für weitere Informationen.Old-School-Lösung mit
explode
undcheckdate
:Dies bestätigt, dass die Eingabe ebenfalls ein gültiges Datum ist. Sie können das natürlich mit einer Regex tun, aber es wird mehr Aufhebens geben - und der 29. Februar kann überhaupt nicht mit einer Regex validiert werden.
Der Nachteil dieses Ansatzes besteht darin, dass Sie sehr vorsichtig sein müssen, um alle möglichen "schlechten" Eingaben abzulehnen, ohne unter keinen Umständen eine Benachrichtigung zu senden. Hier ist wie:
explode
ist auf die Rückgabe von 3 Token beschränkt (so dass, wenn die Eingabe "1-2-3-4" ist,$d
"3-4" wird)ctype_digit
wird verwendet, um sicherzustellen, dass die Eingabe keine nicht numerischen Zeichen enthält (außer den Bindestrichen).array_pad
wird verwendet (mit einem Standardwert, dercheckdate
zum Fehlschlagen führt), um sicherzustellen, dass genügend Elemente zurückgegeben werden, sodass bei einer Eingabe von "1-2"list()
keine Benachrichtigung ausgegeben wirdquelle
DateTime
und nie gehört voncheckdate
... Schande über mich.DateTime
kann das auch. Ich habe gerade die Antwort ausgearbeitet, schau noch einmal nach, wenn du möchtest.getLastErrors
?JJJJ-MM-TT:
/^((((19|[2-9]\d)\d{2})\-(0[13578]|1[02])\-(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\-(0[13456789]|1[012])\-(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\-02\-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\-02\-29))$/g
JJJJ / MM / TT:
/^((((19|[2-9]\d)\d{2})\/(0[13578]|1[02])\/(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\/(0[13456789]|1[012])\/(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\/02\/(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\/02\/29))$/g
MM-TT-JJJJ:
/^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
MM / TT / JJJJ:
/^(((0[13578]|1[02])\/(0[1-9]|[12]\d|3[01])\/((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\/(0[1-9]|[12]\d|30)\/((19|[2-9]\d)\d{2}))|(02\/(0[1-9]|1\d|2[0-8])\/((19|[2-9]\d)\d{2}))|(02\/29\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
DD / MM / JJJJ :
/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
DD / MM / JJJJ :
/^(((0[1-9]|[12]\d|3[01])\-(0[13578]|1[02])\-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\-(0[13456789]|1[012])\-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\-02\-((19|[2-9]\d)\d{2}))|(29\-02\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
quelle
Kriterien:
Jedes durch 4 teilbare Jahr ist ein Schaltjahr, außer wenn es durch 100 teilbar ist, es sei denn, es ist durch 400 teilbar. Also:
Der Februar hat 29 Tage in einem Schaltjahr und 28 Tage, wenn kein Schaltjahr
30 Tage im April, Juni, September und November
31 Tage im Januar, März, Mai, Juli, August, Oktober und Dezember
Prüfung:
Die folgenden Daten sollten alle die Validierung bestehen:
Die folgenden Daten sollten alle nicht validiert werden:
Angebot:
Wir werden auf Daten vom 1. Januar 1000 bis 31. Dezember 2999 testen. Technisch gesehen wurde der derzeit verwendete Gregorianische Kalender erst 1753 für das britische Empire und zu verschiedenen Jahren im 17. Jahrhundert für Länder in Europa verwendet, aber ich werde es nicht tun mach dir darüber Sorgen.
Regex zum Testen für ein Schaltjahr:
Die durch 400 teilbaren Jahre:
Die durch 4 teilbaren Jahre:
Die durch 100 teilbaren Jahre:
Nicht teilbar durch 100:
Die Jahre teilbar durch 100 aber nicht durch 400:
Teilbar durch 4 aber nicht durch 100:
Die Schaltjahre:
Nicht teilbar durch 4:
Kein Schaltjahr:
Gültiger Monat und Tag außer Februar (MM-DD):
Februar mit 28 Tagen:
Februar mit 29 Tagen:
Gültiges Datum:
Dort haben Sie also eine Regex für Daten zwischen dem 1. Januar 1000 und dem 31. Dezember 2999 im Format JJJJ-MM-TT.
Ich vermute, es kann ziemlich verkürzt werden, aber das überlasse ich jemand anderem.
Das stimmt mit allen gültigen Daten überein. Wenn Sie möchten, dass es nur gültig ist, wenn es nur ein Datum und nichts anderes enthält, wickeln Sie es
^( )$
wie folgt ein:Wenn Sie es für einen optionalen Datumseintrag wünschen (dh es kann ein leeres oder ein gültiges Datum sein), fügen Sie es
^$|
am Anfang wie folgt hinzu:quelle
Sie können es so machen:
aber du solltest besser dieses verwenden:
In diesem Fall erhalten Sie ein Objekt, das einfacher zu verwenden ist als nur Zeichenfolgen.
quelle
0175-44-19927
wird bestehen.Ich weiß, dass dies eine alte Frage ist. Aber ich denke ich habe eine gute Lösung.
Du kannst es versuchen. Wenn Sie das Datum auf 21.02.2016 ändern, ist das Echo falsch. Und wenn Sie das Format danach auf dmY ändern, ist das Echo wahr.
Mit diesem einfachen Code sollten Sie in der Lage sein zu überprüfen, welches Datumsformat verwendet wird, ohne es durch den regulären Ausdruck zu überprüfen.
Vielleicht gibt es eine Person, die es in jedem Fall testet. Aber ich denke, meine Idee ist allgemein gültig. Für mich scheint es logisch.
quelle
Sie können ein preg_match mit einer Checkdate-PHP-Funktion verwenden
quelle
preg_match benötigt ein / oder ein anderes Zeichen als Trennzeichen.
Sie sollten auch die Gültigkeit dieses Datums überprüfen, damit Sie nicht mit so etwas wie 9999-19-38 enden
quelle
Sie können es auch so machen:
Dies überprüft nicht nur das Format, sondern auch die Gültigkeit des Datums selbst, da
DateTime
nur gültige Daten erstellt werden und dies mit der Eingabe übereinstimmen muss.quelle
Sie können verwenden
quelle
Überprüfen und validieren Sie das
YYYY-MM-DD
Datum in einer einzeiligen AnweisungDie Ausgabe wird sein:
Tag und Monat ohne führende Null sind zulässig. Wenn Sie dies nicht zulassen möchten, sollte der reguläre Ausdruck wie folgt lauten:
quelle
Wenn Sie diesem Datumstyp entsprechen möchten, verwenden Sie:
quelle
Dies sollte Ihnen mitteilen, ob das Format gültig ist und ob das Eingabedatum gültig ist.
quelle
Wenn dies hilfreich ist, finden Sie hier einen regulären Ausdruck für das jnY-Format (das Jahr muss größer als 2018 sein):
quelle
quelle
Wahrscheinlich nützlich für jemanden:
quelle
'1996-11-31 24:00'); // true
, Ja wirklich? Außerdem gibt es manchmal 61 Sekunden in einer Minute, siehe: en.wikipedia.org/wiki/Leap_secondFunktion zum Überprüfen des generischen Datumsformats:
Ausführungsbeispiel:
quelle
Es hängt alles davon ab, wie streng diese Funktion sein soll. Wenn Sie beispielsweise keine Monate über 12 und keine Tage über 31 zulassen möchten (unabhängig vom Monat, für den das Schreiben einer Datumslogik erforderlich ist), kann dies ziemlich kompliziert werden:
Persönlich würde ich einfach gehen für:
/^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/
quelle
0[1-9]|1[0-2]
entspricht dem Monat 01-12 und dem0[1-9]|[12][0-9]|3[01]
Tag 01-31.Um mit Datumsangaben in PHP zu arbeiten, sollten Sie den PHP-Standard befolgen, damit der angegebene reguläre Ausdruck sicherstellt, dass Sie ein gültiges Datum haben, das mit PHP arbeiten kann.
quelle
1980-01-01
aber wird übereinstimmen2100-02-29
Diese Methode kann nützlich sein, um das Datum in PHP zu überprüfen. Die derzeitige Methode ist für das Format MM / TT / JJJJ. Sie müssen die Parameterfolge in checkdate gemäß Ihrem Format und dem Trennzeichen in explode aktualisieren .
quelle
[Wenn Sie Symfony 4.1.2 verwenden, versuchen Sie dies] [1]
quelle
Ab Laravel 5.7 und Datumsformat dh: 31.12.2019
quelle
Ich suchte nach "wie man das Datum validiert" und fand diese Lösung. Es ist alt, aber ich werde die folgende Methode teilen, die verwendet werden kann, um das Datum in PHP zu validieren.
quelle