2010-06-18 2 views
1

날짜 문자열이 'ddd, dd mmm yy'와 같은 형식 일 때만 true를 반환하는 정규식에 대해 작업하고 있습니다.Regex는 "Sun, 20 Jun 10"과 같은 날짜의 유효성을 확인합니다.

"Sun, 20 Jun 10"또는 "Mon, 21 Jun 10"이지만 "Sunday, 20 Jun 10"또는 "20 Jun 10"은 사용할 수 없습니다.

PHP에서 mb_ereg와 함께 사용됩니다.

내 시도는 지금까지 반쯤 밖에 가지 않았다. 어떤 도움을 주셔서 감사합니다! i 플래그 (대소 문자 구분)이 지원되지 않는 경우

감사합니다, 데이브

답변

1

이것은 하나의 해결책입니다. "00"과 같은 날짜는 허용되지 않습니다. 당신이해야합니다 0이 붙지 않는 일이 정규식을 사용할 수 있도록하려면

$date = 'Fri, 18 Jun 10'; 
$regex = '#([A-Za-z]{3}), ((?:0[1-9])|(?:(?:1|2)[0-9])|(?:3(?:0|1))) ([A-Za-z]{3}) ([0-9]{2})#'; 
preg_match($regex, $date, $matches); 

// Create Vars out of the matching... 
$day_abbr = $matches[1]; 
$day = $matches[2]; 
$month_abbr = $matches[3]; 
$year = $matches[4]; 

은 (단지와 Questionmark을 추가했다.이 같은 날짜 의미 "일을 8 년 6 월 10"은 또한 다음과 같은 정규식 유효합니다.

$regex = '#([A-Za-z]{3}), ((?:0?[1-9])|(?:(?:1|2)[0-9])|(?:3(?:0|1))) ([A-Za-z]{3}) ([0-9]{2})#'; 
+0

내 2 센트 만 : regexes에서'? :'를 피할 수 있습니까? 그들이 읽고 이해하기 쉽게 만든다. 사용자는 필요한 경우 언제든지 추가 할 수 있습니다. 나는 질문이 추가 읽기 또는 교체를 위해 사용되는 잡힌 그룹과 관련이있을 때에 만 사용합니다. '(1 | 2) [0-9]','3 (0 | 1)'등은'[12] [0-9]'와'3 [01]'로 쓸 수 있습니다. 그것은 성능 측면에서 어떤 차이를 만듭니다. – Amarghosh

+1

네, 물론'? :'을자를 수 있습니다.나는 그 변수들을 나중에 더 쉽게 만들 수 있도록 통합 만했다 : 그렇지 않으면'$ day = $ matches [2], $ year = $ matches [9]'... 정말 그렇다. regexes에서 대체와 범위 간의 성능 차이입니다. 범위는 항상 대안의 무리를 위해 더 낫다. 그러나 alternation-operator'| '를 사용하는 것은 2-5 가지 대안에 대해서만 괜찮습니다. 따라서 [12] [0-9]를 사용한 접근 방식도 완벽하게 작동합니다. 그러나 이미 논의한 것처럼 "완벽한 정규식"은 없습니다. 모두가 자신의 취향을 가지고;) –

+0

이 하나는 아름답게 작동합니다. 고마워요! – Trindaz

3
"/[a-z]{3}, \\d{2} [a-z]{3} \\d{2}/i" 

, (Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]{3}을 교체하고 엄격한 검증을 위해 (Month|List) 대응, 또한 [a-zA-Z]

[a-z]를 교체합니다.

+0

나는 \\ d {2}가 일반용이라고 생각하고 있습니다. –

+0

@faileN 완벽하게 (월 이름 포함) 만들기를 원한다면, 끝내고 유지 보수하기가 어려울 것입니다. regex; 나는 오히려 정규식으로 구문을 확인하고 코드로 값을 확인 – Amarghosh

+0

@faileN 결국, 당신이 올 수있는 정규식은'Sat, 18 Jun 10'을 유효하게 전달하지만, 금요일. – Amarghosh

0

여기 당신이 레그를 통해 EREG를 원합니다 이유는 잘 모르겠지만, : 물론

$regex = '([A-Z][a-z]{2}), (([012][0-9])|(3[01])|[0-9]) ([A-Z][a-z]{2}) ([0-9]{2})'; 
mb_ereg($regex, "Sun, 31 Jun 10", $regs); 

, 당신이 POSIX 시간으로 변환 할 경우, 당신은 월 부분을지도해야 할 것 정수로 변환하고 mktime을 사용하십시오.

+1

'([012] [0-9])'로 바꾸면'00'이 허용됩니다. – Amarghosh

+0

'Xxx 00 Yyy 00' – Gordon

관련 문제