문제

나는 ^가 나의 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
 }

내가 알 수 있듯이 이것은 $ 날짜가 내가 4 데시 말로 읽은 형식과 일치하는지 -1 또는 2 decimals -1 또는 2 decimals

일치하는 경우 if 문에 날짜가 표시되면 날짜가 표시되지 않으면 잘못된 날짜 형식의 오류가 발생합니다.

그러나 그냥 날짜를 전달하면서 $ date = '1977'이 아무것도없이 (낮이나 월 없음) 여전히 사실로 겪고 날짜 부분을 표시하면 오류가 발생했을 것이라고 생각했을까요?

누군가 내가 정규 표현에서 내가 놓친 것을 지적 할 수 있습니까? 나는 그것이 ^ 또는 아마도 아마도? $ 일 것 같아요. 결국에는 그것의 일부만 일치 할 수 있습니까?

도움이 되었습니까?

해결책

그룹화 할 필요가 없습니다 절대적으로 모든 것. 이것은 멋지게 보이고 똑같이 할 것입니다.

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

이것은 또한 왜 "1977"허용됩니다 - 월과 주간 부품은 둘 다 선택 사항 (물음표는 선택 사항을 만듭니다).

당신이하는 말을하려면 ( "4 데시 말 - 1 또는 2 데시 말 -1 또는 2 데시 말") 옵션 그룹을 모두 제거해야합니다.

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

"^" 그리고 "$"당신이보고있는 문제와는 아무런 관련이 없습니다. 그들은 단지 문자열의 시작과 문자열 앵커 일뿐입니다. 다른 것은 없습니다 패턴이 설명하는 것보다 점검 된 문자열에 있습니다. 그들을 떠나고 "blah 1977-01-01 blah" 일치하기 시작합니다.

다른 팁

이 시도:

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

문제는 Regex가 '?'의 월과 일을 선택적으로 허용하는 것이 었습니다. 캐릭터.

^ 그리고 $ 패턴이 통과 된 문자열의 각각 시작과 끝에 패턴을 고정합니다. ? 이전 패턴의 0 또는 1과 일치하는 승수입니다 (이 경우 괄호 비트).

패턴은 1 년, 1 년, 한 달, 1 년, 한 달 및 날짜와 일치합니다. 괄호를 따르면 결승전이 보입니다. ? 연도 이후 패턴 전체를 둘러싼 파렌에서 운영되고 있습니다.

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

좋아, 이것을 헤어 보자 :

  • '~^( d d d d) (-( d {1,2}) (-( d {1,2}))?)? $ ~'
  • ~ - 처음과 끝에는 regexp-delimiters이므로 실제로 정규 표현의 일부가 아닙니다.
  • ^ - 수단 "이것은 줄의 시작입니다"
    • 문자열의 중간에 일치하는 것을 피하고 문자열의 시작이 일치하도록 앵커를 고정시킵니다.
  • ( d d d d) - 4 자리 일치 (및 캡처), 선택 사항이 아닙니다.
    • 이것은 또한 다음과 같이 쓸 수 있습니다 d {4}
  • (-( d {1,2}) (-( d {1,2}))?)? - 선택적 그룹과 일치하고 캡처합니다.
    • 이 그룹이 존재하는 경우 대시 여야하고 한 숫자 (주 또는 월), 대시, 그리고 1 ~ 2 자리 (주일 또는 월)이어야한다고 말합니다.
  • $ - 문자열의 시작 부분을 의미하므로 문자열의 시작 부분에서 전체 문자열이 regexp와 일치해야 함을 의미합니다.

이 regex가 일치하는 몇 가지 예 :

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

일치하지 않는 몇 가지 예 :

  • 82-08-11
  • 2009-10

보시다시피,이 Regex는 실제로 유효한 날짜가 아닌 "날짜"를 수락 할 것이므로 아마도 어떤 종류의 날짜 처리 기능을 통해 실행할 것입니다. strtotime.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top