Ich versuche, einen Termin-Regex-Validator zu erstellen. Das Problem, das ich habe, ist, dass ich ein Eingabefeld mit "date"
type verwende, das in Chrome wie ein Charm funktioniert. Es öffnet sich ein Kalender-ähnliches in Chrome, aber im übrigen tut es nichts, also entschied ich mich für eine manuelle Eingabe des Datums für den Rest zu gehen.
Das ist mein Fehler, der die Nachricht wirft (ich suche nach dem Format JJJJ-MM-TT):
%Vor%Ich weiß, dass es viele Beispiele dafür gibt, aber ich habe schon 20 probiert und konnte es nicht lösen. Vielleicht vermisse ich etwas.
Hier ist das Eingabefeld, wenn etwas relevant:
%Vor% Ihre Regex funktionierte nicht, weil Sie unescaped /
delimiter.
Die Regex, die das Datum im Format YYYY-MM-DD
wie folgt validiert:
Es wird validiert, dass das Jahr mit 19
oder 20
beginnt, dass der Monat nicht größer als 12
und nicht gleich 0
ist und dass der Tag nicht größer ist als 31
und doesn 't gleich 0
.
Mit Ihrem ersten Beispiel könnten Sie es so testen:
%Vor% Verwenden Sie Regex nicht dafür, Sie können das gleiche Ergebnis erhalten, indem Sie DateTime::createFromFormat
Sie können hier mehr lesen:
Es scheint jedoch, dass das Problem völlig unabhängig von PHP ist.
PHP läuft am Backend und es sieht so aus, als hätten Sie ein Front-End-Problem.
Ich bezweifle auch, dass das Problem der verwendete Eingabetyp ist. Wenn ein Browser den angegebenen Eingabetyp nicht unterstützt, wird standardmäßig der Text verwendet. Sehen Sie es hier:
Mein Browser weiß nicht, was <input type="whatever" />
ist, daher setzt er den Eingabetyp auf "text". Wenn ich diese 4 Eingaben in ein <form action="myForm.php" method="POST"></form>
-Tag umgebe, sendet der Browser die Eingaben an den Server, weil es dem Server egal ist, ob die Eingaben ausgeblendet waren, Optionsfelder, Auswahlen, Texte oder Passwort. Der Server empfängt nur Rohdaten.
Mehr als wahrscheinlich ist Ihr Problem mit Ihrem Javascript und nicht mit Ihrem PHP. Versuchen Sie herauszufinden, ob der Browser, der Ihr Widget nicht anzeigt, Ihnen mitteilt, dass auf Ihrer Seite ein Fehler aufgetreten ist.
Safari und Firefox haben Entwicklungs- / Debugging-Tools, nicht so sicher über IE.
Überprüfen und validieren Sie YYYY-MM-DD
date in einer einzeiligen Anweisung
Siehe die Details in meiner Antwort hier .
Verwenden Sie nicht Blind DateTime::createFromFormat
, um Daten zu validieren. Nehmen wir das nicht vorhandene Datum 2018-02-30
und sehen Sie:
Ja, es gibt true
, nicht false
zurück, wie Sie vielleicht erwarten. Interessanter:
Auch true
... Also, validiert nur die Anzahl der Ziffern. Noch ein Versuch:
Endlich false
.
Was hier vor sich geht, können wir anhand dieses Ausschnitts sehen:
%Vor% Wie Sie sehen können, wenn wir das nicht vorhandene 2018-02-30
übergeben, enthält das DateTime
-Objekt 2018-03-02
. Ich nehme an, dass der Februar 2018 28 Tage hat, dh das maximale Datum ist 2018-02-28
, und wenn wir den Tag 30
übergeben, addiert createFromFormat nur 30 Tage zum 2018-02-01
und erstellt ein neues Datum ohne vorherige Gültigkeitsprüfung.
Tags und Links php regex date preg-match