2013-05-09 1 views
0

일치. 예를 들어 그것이 달의 첫날 일 때 선행 0이 있어야 함을 의미합니다.는 정규식 나는 PHP의 정규식에서 특정 날짜 형식과 일치하기 위해 노력하고있어 날짜와 시간

^[0-12]{2}-[0-31]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$ 

을하지만, 위의 패턴은 같은 타임 스탬프에 실패합니다 : 예 : :

01-01-2013 01:01:01 

나는 다음과 같은 패턴으로 그것을 시도 09-05-2013 19:45:10.

http://rubular.com/r/eGBAhwiNCR

나는 문제는이 같은 날짜 시간을 확인하는 올바른 접근하지 않을 수 이해하지만 난 정말 위의 잘못이 무엇인지 알고 싶어요.

+3

이 같은 0에서 12 사이의 숫자가 사용할 수있는 표준입니다 : 0과 1 사이의 모든 문자를 의미한다 [0-12]를 , 그리고 문자 2. 그것은 같다. [012] –

답변

1

문제는 "범위"를 확인하는 경우입니다 (예 : [0-12]). 그것은 문자 클래스이며 0에서 1, 그리고 2와 일치하도록 정규 표현식에 알려줍니다. 따라서 첫 번째 문자 이후에 더 많은 숫자를 추가하면 예상대로 작동하지 않습니다. 정규식을 약간 변경하면 ([0-12] 이니셜) [0-319]{2}-[0-12]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$09-01-2011 11:11:10과 일치합니다.

각 공백에 유효한 숫자가 있는지 확인하려면 상자 밖에서 약간의 사고가 필요합니다. 정규식 :

(0[1-9]|[12][\d]|3[0-2])-(0[1-9]|1[0-2])-[\d]{4} (0[1-9]|1[\d]|2[0-3]):(0[1-9]|[1-5][\d]):(0[1-9]|[1-5][\d])$

당신이 regex you attempted로 기대하고 무엇을 작동합니다.

작은 조각으로 나누면 의미가 있습니다 (처음에는 무서운 것처럼 보입니다). 첫 번째 작품 ("days"는 0-31)을 봅니다.

(0[1-9]|[12][\d]|3[0-2])

은을 사용하고, 3 가지 경우를 처리하기.

  1. 0[1-9] - 0-9 다음에 오는 임의의 수. 우리는 00과 같은 숫자를 허용하기 때문에 [0-9]{2}을 원하지 않습니다. 따라서 숫자가 0으로 시작하고 그 뒤에 다른 숫자가있는 경우 (한 자릿수 일 경우) 유효합니다.
  2. [12][\d] - 1 or 2 다음에 임의의 숫자가옵니다.이렇게하면 숫자 10-29이 유효합니다.
  3. 3[0-2]-2 통해 어떤 0 뒤에 330, 31과 일치 32.

오류가 발생하지 않았지만이 패턴은 날짜의 각 "필드"에 대해 수행됩니다. 따라서이 정규식은 유효한 각 필드의 유효성을 검사하지만 유효 날짜를 확인하는 더 좋은 방법이 필요할 수 있습니다. 예를 들어 30-02 일 수 있으며 2 월에 30 일을 사용할 수 없는지 확인하는 것은 복잡하지 않습니다.

0
^[0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}$ 
+0

이것은 모든 '0'과 일치 할 것이고, 달은 '99'와 같은 숫자 일 것이다. – Walls

+0

@Walls 심각하게? 그걸로 나를 슬퍼 할거야? 자신의 솔루션은 더 이상 유효하지 않습니다. 2 월 31 일과 같은 날짜가 허용됩니다. * 패턴 *이 제대로 일치하므로 정규식으로 모든 작업을 시도하는 대신 올바른 날짜 검사기에 입력해야합니다. –

+0

@Walls 다른 사람들은 왜 그 이유에 대해 좋은 대답을 이미주었습니다. 나는 필요한 것을 정확하게 수행 할 수있는 코드를 제공했다. 다른 사람들의 대답을 되풀이해야 할 이유가 전혀 없는데, 나는 그저 상상 만해도 좋을 때 그 부분을 추가 할 수 있습니다. –

7

[0-12]{2} 일치하지 않는 번호 12까지 0. 대신 문자 클래스는 0에서 1까지이며 숫자는 2입니다. 연속 된 한정 기호는 단지 0, 1 또는 2를 두 번 반복하는 것을 반복합니다.

다른 자리 표시자는 동일한 작동하지 않는 구성표를 따릅니다.

더 나은 정규 표현식을 Google로 검색 할 수없는 경우 \d{2} 또는 \d{4}으로하는 것이 가장 좋습니다. 더 나은 방법은 아직 DateTime을 사용하여 형식을 확인하는 것입니다.

0

검증의 예는 PHP에 있지만 정규식은

/*pass the date you wanna validate as parameter to the function. 
The function returns true if it is valid and false if the date passed is not valid 
*/ 
function DateValid($date){ 
    //format will be fr if the date is in french format and en if the date is in en format 
    $format=''; 
    //regex that tests if the date is in french format or english, if not in one of these two then it is not valid 
    if(preg_match("#^(\d{1,2})[\-./ ](\d{1,2})[\-./ ](\d{4})(?: (\d{1,2})(?:[ .-](\d{1,2})){1,2})?$#",$date,$m)){ 
     $format='fr'; 
    }elseif (preg_match('#^(\d{4})[-. ](\d{1,2})[-. ](\d{1,2})(?: (\d{1,2})(?:[ .-](\d{1,2})){1,2})?$#', $date, $m)) { 
     $format='en'; 
    }else{ 
     echo '<p style="font-size:150px">not english nor french</p>'; 
     return false; 
    } 
    //If it is french format or English then check if the date is correct 
    if($format=='fr'){ 
     if (checkdate($m[2], $m[1], $m[3]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) { 
      echo '<p style="font-size:150px">Not valid french</p>'; 
      return false; 
     }else{ 
      echo '<p style="font-size:150px">Valid french</p>'; 
      return true; 
     } 
    }elseif($format=='en'){ 
     if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) { 
      echo '<p style="font-size:150px">Not valid english</p>'; 
      return false; 
     }else{ 
      echo '<p style="font-size:150px">Valid english</p>'; 
      return true; 
     } 
    } 
} 
관련 문제