문제

DateTime (2008-09-01 12:35:45 ) 의 RegEx 패턴은 무엇입니까?

다음 오류가 발생합니다.

끝 구분 기호 '^'을(를) 찾을 수 없습니다.

사용:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

다음 오류가 발생합니다.

경고:preg_match() [function.preg-match]:컴파일 실패:19행 E:\www\index.php의 오프셋 0에서 반복할 내용이 없습니다.

도움이 되었습니까?

해결책

@에스포:정규식은 믿을 수 없을 만큼 훌륭하다고 말하고 싶습니다.사용자가 입력한 날짜와 시간을 실제로 알아내려는 경우와 같이 일치 항목에 유용한 작업을 수행하는 코드를 작성하고 싶지 않습니다.

Tom의 솔루션은 훨씬 더 간단하고 괄호를 추가하면 사용자가 입력한 값을 쉽게 얻을 수 있기 때문에 더 안정적일 것 같습니다.

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

Perl을 사용하는 경우 다음과 같이 값을 얻을 수 있습니다.

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

다른 언어에도 비슷한 기능이 있습니다.한자리 월과 같은 값을 허용하려면 정규식에 몇 가지 사소한 수정이 필요합니다.

다른 팁

@Espos에 따라 언급된 형식에서는 작동하지만 다른 형식에서는 작동하지 않는 간단한 버전입니다.

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(? =.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][ 26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]| 1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2 -9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0- 5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2}) ?$


이 RE는 날짜 및/또는 시간 패턴.2월의 일들또한 윤년에 대해 검증되었습니다.날짜:안으로 dd/mm/yyyy 또는 d/m/yy 형식 사이 1/1/1600 - 31/12/9999.선행 0 선택 사항입니다.날짜 구분 기호는 다음과 같을 수 있습니다. 일치하는 대시(-), 슬래시(/) 또는 마침표(.) 배:hh:MM:ss에서 오전/오후 12시간 형식(오전 12:00 - 오후 11:59:59) 또는 hh:MM:ss 군사 시간 형식(00:00:00 - 23:59:59).더 12 시간 형식:1) 시간 동안 선행 0입니다.2) 회의록 초는 12의 경우 선택 사항입니다. 시간 형식 3) AM 또는 PM이 필요합니다. 대소문자를 구분합니다.군사 시간 1) 모든 시간에 선행 0이 있어야 합니다. 10 미만.2) 회의록은 필수.3) 초는 선택사항입니다.날짜시간:위의 조합 형식.날짜가 먼저이고 시간이 먼저입니다 공백으로 구분됩니다.예) dd/mm/yyyy hh:MM:ss


편집하다:StackOverflow가 때때로 특수 문자를 제거/파괴하므로 regexlib.com 웹사이트에서 RegEx를 복사했는지 확인하세요.

^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$
$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$matches는 다음과 같습니다:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

날짜/시간 형식의 문자열을 분리하는 쉬운 방법입니다.

Imran에 관하여 2008 년 9 월 1 일 12시 33분에서 답변 누락 된 것이 있습니다.패턴에서 올바른 패턴은 다음과 같습니다.

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

이것은 반환

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

내 해결책은 다음과 같습니다.

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u

정규식 패턴을 다음에서 수정했습니다. http://regexlib.com/REDetails.aspx?regexp_id=610.다음 패턴은 귀하의 경우와 일치해야 합니다.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

YYYY-MM-DD HH:MM:SS

PHP preg 함수는 임의의 문자일 수 있는 구분 기호 문자로 래핑되는 정규식을 필요로 합니다.정규식 내에서 이스케이프하지 않고는 이 구분 기호 문자를 사용할 수 없습니다.이렇게 하면 작동합니다(여기서 구분 기호는 /입니다).

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

날짜/시간만 포함된 행을 일치시켜야 하는 경우 정규식의 시작과 끝에 ^ 및 $를 추가하세요.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

PHP 매뉴얼의 preg_match() 링크

다음은 단순화된 버전입니다(Espo의 답변에서 유래).날짜의 정확성(윤년 포함)을 확인하며 hh:mm:ss는 선택 사항입니다.
작동하는 예:
- 31/12/2003 11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

내 해결책은 다음과 같습니다.

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

Regular expression visualization

Debuggex 데모

https://regex101.com/r/lbthaT/4

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