Regex zur Validierung Datum in PHP mit format YYYY-MM-DD
Ich versuche, ein date regex-validator. Das Problem das ich habe ist, dass ich mit einem input-Feld mit "date"
geben, die funktioniert wie ein Charme in Chrom; es öffnet sich ein Kalender-wie in Chrome, aber der rest macht es nichts, also habe ich beschlossen zu gehen für eine manuelle Eingabe des Datums für den rest.
Dies ist mein Fehler werfen Meldung (ich bin auf der Suche nach YYYY-MM-DD-format):
$date_regex ='#^(19|20)\d\d[\- /.](0[1-9]|1[012])[\- /.](0[1-9]|[12][0-9]|3[01])$#';
$hiredate = $_POST['hiredate'];
if (!preg_match($date_regex, $hiredate)){
$errors[] = 'Your hire date entry does not match the YYYY-MM-DD required format.';
}
Ich weiß, es gibt eine Menge Beispiele, aber ich habe versucht, so um die 20 schon und ich konnte es nicht lösen. Vielleicht bin ich etwas fehlt.
Hier ist das Eingabefeld, wenn etwas relevant:
<input type="date" name="hiredate" />
- Warum nicht explodieren und verwenden checkdate() statt?
- Ist es eine standard-Prozedur ? Ich fand es in einem anderen post, aber für mich nicht funktioniert. FYI, ich will lassen Sie Sie einfügen möchten YYYY/MM/DD oder YYYY.MM.DD oder YYYY-MM-DD. Um nicht zurückhalten, Ihnen zu viel.
- Wäre es leichter, zu bieten 3 separate
<input>
Boxen mit einer entsprechenden maxlength und Stelle-überprüfen nur die bekommt concatednated in das richtige format auf das backend? Sie können hinzufügen Zuhörer zu jedem Eingabefeld zum nächsten zu gehen, wenn eine personkeypressed
2 Ziffern. Der Benutzer doesn ' T geben ein Ratten hinter, was format Sie benötigen, und Sie wird nur frustrieren Sie am besten, wenn es nicht Ihre persönlichen nativen format - Eigentlich dachte ich, aber wäre es nicht kompliziert genug, halten Sie im Verstand einige Monate 28-29 Tage, andere 31 ? Meine Vermutung ist, dass die regex ist schon okay, denn ich habe gesehen, dass es in eine Menge von stellen. Vielleicht mein Fehler-handling ist alles falsch... Aber haben Sie vielleicht einen Punkt.
- Ich würde die build-Logik, sagt
If insert fails then slap user in face
...ich würde mir wünschen, dass eine person weiß, dass Sie nicht zu gehen außerhalb der Grenzen, die in einem date-Feld oder anderes, sollten Sie wahrscheinlich nicht anheuern 🙂 - Man könnte noch einen fallback-Kalender-widget für diese browser-Versionen nicht unterstützt Datum-Eingänge.
- Ich nicht Folgen. Was genau meinst du ? Tatsächlich ist die unsupporting Browser sind mein Problem. Ich habe manchmal verwendet,- webkit oder -moz-wenn ich code schreiben, um die Kompatibilität mit mehreren Browsern, aber jetzt denke ich nur Chrome hilft mir.
- bin ich hier etwas fehlt? Ich verstehe nicht, warum Sie sprechen über Browser, in einer php-Frage. PHP läuft in den back-end, Browser sind Teil der front-end. Wenn Ihre Daten nicht angezeigt/richtig validiert, die auf bestimmten Browsern, dann ist es nicht ein PHP-Problem. Es ist eine HTML/JS/CSS Problem. Die "date" - Typ ist für mobile Geräte, wenn ein browser nicht verstehen, einen bestimmten Typ hat, dann wird standardmäßig der text, also das ist nicht das Problem.
- AlanChavez, das Datum-format unterstützt in Chrome und wahrscheinlich unterstützt werden, in andere als gut. Ich erwähnte es nur, weil in Chrome habe ich nicht validieren Sie die Eingabe-Feld, während die anderen, die ich tun. Es ist nicht php verwandt, ich war nur darauf es heraus. Die Validierung ist jedoch auf php bezogen.
- Ich add regex arbeiten für Sie, mit Beispielen, werfen Sie bitte einen Blick!
- Yep, es funktionierte wie ein Charme ! Ich muss übersehen haben, die ohne Umschreibung /.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein regex nicht funktionieren, weil Sie hatte unescaped
/
Trennzeichen.Den regex validieren würde das Datum im format
YYYY-MM-DD
wie folgt:Es wird überprüft, ob das Jahr beginnt mit
19
oder20
, dass der Monat nicht größer als12
und nicht gleich0
und dass der Tag nicht größer als31
und nicht gleich0
.Beispiel Online
Mit Ihrem ersten Beispiel könnte man es testen wie diese:
Beispiel Online
Verwenden Sie keine regex für diese, können Sie das gleiche Ergebnis von
DateTime::createFromFormat
Lesen Sie hier mehr:
http://php.net/manual/en/datetime.createfromformat.php
Jedoch, wie es scheint, das Problem ist völlig unabhängig von PHP.
PHP läuft auf dem back-end, und es scheint, Sie haben eine front-end-problem.
Bezweifle ich auch, das problem ist der input-Typ Sie verwenden. Wenn ein browser unterstützt nicht die Eingabe geben, die Sie angegeben, dann wird standardmäßig der text. Sehen Sie es hier:
http://jsfiddle.net/FKGCA/
Mein browser nicht weiß, was die
<input type="whatever" />
ist, so ist es standardmäßig der input type auf "text". Wenn ich wickeln Sie diese 4 Eingänge in einer<form action="myForm.php" method="POST"></form>
tag, sendet der browser die Eingaben für die server, weil der server kümmert sich nicht/wissen, wenn die Eingänge waren versteckt, radio-buttons, Auswahl, Texte, oder das Passwort. Der Server erhält nur die raw-Daten.Mehr als wahrscheinlich, das Problem mit Javascript und nicht mit PHP. Versuchen Sie, um zu sehen, wenn der browser das nicht anzeigen Ihr widget sagt Sie, dass es ein Fehler irgendeiner Art in Ihre Seite ein.
Safari und Firefox haben Entwicklungs - /debugging-tools nicht so sicher über den IE.
Prüfen und validieren
YYYY-MM-DD
Datum in einer Zeile AnweisungSehen Sie die details in meiner Antwort hier.
Verwenden Sie nicht blind
DateTime::createFromFormat
zu validieren Termine. Nehmen wir ein nicht-existierendes Datum2018-02-30
- und siehe:Ja, es gibt
true
, nichtfalse
wie Sie vielleicht erwartet. Interessanter:Auch
true
... Also, es bestätigt nur die Anzahl der Ziffern. Noch ein Versuch:Endlich
false
.Was ist hier Los wir sehen können, aus diesem snippet:
Wie Sie sehen können, wenn wir an nicht-existente
2018-02-30
, dieDateTime
- Objekt enthält2018-03-02
. Ich gehe davon aus, dass es ist, weil Februar 2018 hat 28 Tage, also das maximale Datum ist2018-02-28
, und wenn wir an dem Tag30
, createFromFormat nur fügt 30 Tage, um die2018-02-01
und erstellen neuen Termin, ohne Vorherige Datum der Validierung.