Frage

Ich kann nicht ganz meinen Kopf um, was die ^ in meinem preg_match zu tun.

 if (preg_match('~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~', trim($date), $dateParts)) {
   echo the $dateparts and do some magic with them
 } else {
   tell me the date is formatted wrong
 }

Wie ich es sehe dies schaut, um zu sehen, ob der $ date das Format übereinstimmt, die ich gelesen als 4 Dezimalstellen - 1 oder 2 Dezimalstellen - 1 oder 2 Dezimalstellen

Wenn sie paßt dann die IF-Anweisung das Datum anzeigt, wenn es dann nicht einen Fehler von falscher Datumsformatierung gibt.

vorbei aber es nur das Jahr $ Date = ‚1977‘ mit nichts anderem (kein Tag oder Monat) geht es nach wie vor durch als wahr und zeigt die Datumsbestandteile, würde ich dachte, es würde einen Fehler werfen?

Kann jemand darauf hinweisen, was ich in den regulären Ausdruck bin fehlt? Ich vermute, es ist die ^ oder möglicherweise das? $ Am Ende bedeuten kann nur Spiel Teil davon?

War es hilfreich?

Lösung

Es besteht keine Notwendigkeit zu einer Gruppe absolut alles . Das sieht schöner und wird das gleiche tun:

preg_match('~^\d{4}(-\d{1,2}(-\d{1,2})?)?$~', trim($date), $dateParts)

Dies erklärt auch, warum "1977" akzeptiert wird - die Monats- und Tages Teile sind beide optional (das Fragezeichen macht etwas optional)

.

Zu tun, was Sie sagen ( „4 Dezimalstellen - 1 oder 2 Dezimalstellen - 1 oder 2 Dezimalstellen“), müssen Sie sowohl die optionalen Gruppen entfernen:

preg_match('~^\d{4}-\d{1,2}-\d{1,2}$~', trim($date), $dateParts)

Die „^“ und „$“ haben nichts mit der Frage zu tun, die Sie sehen. Sie sind nur Start-of-String und End-of-string Anker, um sicherzustellen, dass nichts anderes als das, was das Muster beschreibt in dem geprüften String ist. Lassen Sie sie ab und "blah 1977-01-01 blah" beginnen zu lassen.

Andere Tipps

Versuchen Sie folgendes:

'~^(\d\d\d\d)-(\d{1,2})-(\d{1,2})$~'

Das Problem ist die Regex erlaubt den Monat und den Tag als optional durch die ‚?‘ Charakter.

^ und Ihr Muster an den Anfang $ verankern bzw. des Strings in vergangen beenden. Der ? ein Multiplikator ist, passend für 0 oder 1 des vorangehenden Musters (in diesem Fall ist die parenthesised Bit).

Ihr Muster entspricht ein Jahr oder ein Jahr und einen Monat oder ein Jahr und einen Monat und ein Datum; wenn Sie die Klammern folgen, sehen Sie die letzte ? auf den Pars Betrieb der Gesamtheit des Musters nach dem Jahr umgibt.

^    # beginning of string
    (\d\d\d\d)   #year
    (
        -(\d{1,2})   #month after a dash
        (
            -(\d{1,2}) #date after a dash
        )? #date optional
    )?   # month and date optional
$   # end of string

Ok, lassen Sie uns dies brechen für Sie:

  • '~ ^ (\ d \ d \ d \ d) (- (\ d {1,2}) (- (\ d {1,2})))? $ ~'
  • ~ -. Am Anfang und Ende sind RegExp-Trennzeichen, so dass sie nicht wirklich Teil des regulären Ausdrucks
  • ^ - Means "Dies ist der Anfang der Zeile"
    • Vermeidet Spiele in der Mitte der Saite und verankert es so, dass der Anfang der Zeichenfolge übereinstimmen muss
  • (\ d \ d \ d \ d) - Spiele (und Aufnahmen) vier Ziffern und ist nicht optional
    • Dies könnte auch geschrieben werden als \ d {4}
  • (- (\ d {1,2}) (- (\ d {1,2})))? - Spiele (und Captures) eine optionale Gruppe.
    • Er sagt, dass, wenn diese Gruppe vorhanden ist, muss es einen Bindestrich, gefolgt von einer oder zwei Ziffern (Tag oder Monat), gefolgt von einem Bindestrich, gefolgt von einer oder zwei Ziffern (Tag oder Monat)
  • $ - Bedeutet Ende der Zeichenfolge, so dass diese zusammen mit ^ am Anfang der Zeichenfolge bedeutet, dass die gesamte Zeichenfolge muss die Regexp übereinstimmen
  • .

Einige Beispiele für diese Regex passt auf:

  • 1982.08.11
  • 1982-30-01
  • 8127-99-52

Einige Beispiele, die nicht übereinstimmen:

  • 82-08-11
  • 2009-10

Wie Sie sehen können, wird diese regex einige „Termine“ akzeptieren, die nicht wirklich gültige Daten sind, so würde ich es wahrscheinlich durch eine Art Datum Handhabungs laufen Funktion zu, wie strtotime .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top