Php Preg Maç sirkumfleks ^

4 Cevap php

Oldukça ^ benim preg_match'in ne yaptığını başımı alınamıyor.

 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
 }

As I see it this is looking to see if the $date matches the format which I read as 4 decimals - 1 or 2 decimals - 1 or 2 decimals

Bu eşleşmesinin eğer o yanlış tarih biçimlendirme bir hata veriyor yoksa o zaman IF deyimi, tarihi gösterir.

However just passing it the year $date = '1977' with nothing else (no day or month) it still goes through as true and displays the dateparts, I would thought it would throw an error?

Birisi normal ifadede özlüyorum ne işaret edebilir? Ben bunun sadece bir maç kısmını anlamına gelebilir ^ ya da muhtemelen? $ Sonunda öyle tahmin ediyorum?

4 Cevap

Grubuna absolutely everything gerek yoktur. Bu güzel görünüyor ve aynı yapacağız:

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

"1977" kabul edilir yüzden de açıklıyor - ay ve gün parçalar both isteğe bağlı (soru işareti isteğe bağlı bir şey yapar) vardır.

Eğer ("- 1 veya 2 ondalık - 4 ondalık 1 veya 2 ondalık") dediklerini yapmak için, isteğe bağlı gruplar hem de kaldırmanız gerekir:

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

"^" ve "$" Gördüğünüz sorunu ile ilgisi yoktur. Onlar sadece bir-dize-start ve end-of-string çapa, emin ne desen açıklar kontrol dizesinde daha nothing else o yapıyoruz. Onları bırakın ve "blah 1977-01-01 blah" maç başlar.

Bu deneyin:

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

Sorun regex tarafından ay ve gün olarak isteğe izin oldu '?' karakter.

^ ve $ başlangıcına kadar desen çapa ve içeri geçirilen dize sırasıyla sonuna ? önceki desen 0 veya 1 eşleşen bir çarpanı (Bu durumda, parenthesised bit).

Sizin desen bir yıl ya da bir yıl ve bir ay ya da bir yıl ve bir ay ve bir tarih eşleşir; Eğer parantez takip ederseniz, son ? yıl sonra desenin tamamını çevreleyen Pars üzerinde çalışırken görürsünüz.

^    # 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

Tamam, senin için bu kadar kırılsın:

  • '~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~'
  • ~ - başında ve sonunda RegExp-sınırlayıcılardır, bu yüzden gerçekten normal ifadenin bir parçası değildir.
  • ^ - Means "This is the beginning of the line"
    • Kaçınır dize ortasında maçlar ve dizenin başlangıç ​​eşleşmesi gerektiğini öyle çapa
  • (\d\d\d\d) - Matches (and captures) four digits, and is not optional
    • Bu, aynı zamanda \d{4} şeklinde yazılabilir
  • (-(\d{1,2})(-(\d{1,2}))?)? - Matches (and captures) an optional group.
    • Bu grup varsa, bir ya da iki basamak (gün veya ay) tarafından izlenen bir çizgi takip ettiği bir veya iki basamaklı (gün veya ay) izlediği bir çizgi,,, olması gerektiğini söyledi
  • $ - dizenin sonuna araçlar, bu yüzden birlikte dize başında ^ ile bütün dize Regexp eşleşmesi anlamına gelir.

Bu Regex maç olacak ne bazı örnekler:

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

Bazı örnekler maç GEÇMEZ:

  • 82-08-11
  • 2009-10

Gördüğünüz gibi, bu regex gerçekten geçerli bir tarih değil bazı "tarih" kabul eder, bu yüzden muhtemelen böyle strtotime gibi, çok tarih işleme fonksiyonu çeşit yoluyla çalıştırmak istiyorum.