문제
나는 ^가 나의 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.