Question

Je ne peux pas obtenir assez ma tête ce que le ^ fait dans mon preg_match.

 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
 }

Comme je vois cela cherche à voir si la date de $ correspond au format que je lis comme 4 décimales - 1 ou 2 décimales - 1 ou 2 décimales

si elle ne correspond alors l'instruction IF affiche la date, si elle ne donne donc pas une erreur de formatage de date incorrect.

Cependant, juste faisant passer l'année $ date = « 1977 » il va encore à travers aussi vrai avec rien d'autre (pas de jour ou par mois) et affiche les dateparts, je pensais qu'il jetterait une erreur?

Quelqu'un peut-il indiquer ce que je me manque dans l'expression régulière? Je devine que c'est le ^ ou peut-être la? $ À la fin peut signifier qu'une partie de correspondance de celui-ci?

Était-ce utile?

La solution

Il n'y a pas besoin de groupe absolument tout . Cela semble plus agréable et fera la même chose:

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

Cela explique aussi pourquoi « 1977 » est acceptée - les parties de mois et le jour sont à la fois en option (le point d'interrogation quelque chose fait en option)

.

Pour faire ce que vous dites ( « 4 décimales - 1 ou 2 décimales - 1 ou 2 décimales »), vous devez supprimer les deux groupes en option:

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

Le « ^ » et « $ » n'a rien à voir avec la question que vous voyez. Ils sont tout début de chaîne et points d'ancrage en fin de chaîne, en vous assurant que rien d'autre que ce que le modèle décrit est la chaîne cochée. Laissez-off et va commencer à "blah 1977-01-01 blah" correspondre.

Autres conseils

Essayez ceci:

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

Le problème a été le regex permettait le mois et le jour en option par le « ? » caractère.

^ et $ ancrer votre motif au début et à la fin, respectivement, de la chaîne passée. Le ? est un multiplicateur, correspondant à 0 ou 1 du motif précédent (dans ce cas, le bit parenthesised) .

Votre motif correspond à un an ou un an et un mois, ou un an et un mois et une date; si vous suivez les parenthèses, vous verrez le dernier fonctionne <=> sur les parens entourant l'ensemble du motif après l'année.

^    # 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, nous allons briser ce pour vous:

  • ~ ^ (\ d \ d \ d \ d) (- (\ d {1,2}) (- (\ d {1,2})))? $ ~ '
  • ~ -. Au début et la fin sont RegExp-délimiteurs, donc ils ne sont pas vraiment partie de l'expression régulière
  • ^ - Moyens "Ceci est le début de la ligne"
    • Evite correspond au milieu de la chaîne, et il ancre de sorte que le début de la chaîne doit correspondre
  • (\ d \ d \ d \ d) - Matches (et captures) quatre chiffres, et n'est pas en option
    • Cela pourrait aussi être écrit comme \ d {4}
  • (- (\ d {1,2}) (- (\ d {1,2})))? - Matches (et captures) un groupe en option.
    • Il dit que si ce groupe existe, il doit être un tableau de bord, suivi, suivi d'un tiret, suivi d'un ou deux chiffres (jour ou mois)
    • par un ou deux chiffres (jour ou mois)
  • $ - Moyens fin de chaîne, donc ce, avec ^ au début de la chaîne signifie que toute la chaîne doit correspondre à la Regexp
  • .

Voici quelques exemples de ce que cette expression rationnelle correspond à:

  • 11/08/1982
  • 1982-30-01
  • 8127-99-52

Voici quelques exemples qui ne correspond pas à:

  • 82-08-11
  • 2009-10

Comme vous pouvez le voir, cette regex acceptera des « dates » qui ne sont pas vraiment des dates valides, donc je ne serais probablement courir à travers une sorte de fonction de la date de traitement aussi, comme strtotime .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top