wyrażenie regularne

0

Szukam dat w tekście za pomocą pattern i matcher w formacie YYYY-MM-DD. Nie wiem tylko jak zrobić ograniczenie, aby nie grupować błędnych dat, które mają zapisaną trzycyfrową liczbę na dniach np. 2009-12-111

0
pabloxs napisał(a):

Szukam dat w tekście za pomocą pattern i matcher w formacie YYYY-MM-DD. Nie wiem tylko jak zrobić ograniczenie, aby nie grupować błędnych dat, które mają zapisaną trzycyfrową liczbę na dniach np. 2009-12-111

^\d{4}-\d{2}-\d{2}$

1

regexy to nie jest zbyt dobry util do sprawdzania poprawnosci dat, lepiej uzyc jakiejs klasy w stylu SimpleDateFormat czy czego tam sie w javie teraz uzywa.

0
.two {
	font-weight:700;
	text-shadow:blue 2px 2px 2px;
}
.one {
	text-shadow:orange 2px 2px 2px;
	font-weight:bold;
}
<?php
$pattern = '@^(?:201[0-8]|200[0-9]|[0-1][0-9][0-9][0-9])-(?:0[1-9]|10|11|12)-(?:0[1-9]|1[0-9]|2[0-9]|30|31)$@';

for($i=2000;$i<=2018;$i++) {
	$tmp = [$i.'-'.'0'.rand(1,9).'-'.'0'.rand(1,9),$i.'-'.'1'.rand(1,9).'-'.'2'.rand(1,9)];

	$subject = $tmp[rand(0,1)];

	$int = preg_match($pattern,$subject,$matches);

	if($int==1) {
		
		$split = explode('-',$matches[0]);
		
		if($split[0]%4==0 && $split[0]%100!=0 || $split[0]%400==0 && $split[1]=='02') {
			//echo 'This is Leap Year';
			$pattern2 = '@^(?:0[1-9]|1[0-9]|2[0-9])$@';
			if(preg_match($pattern2,$split[2])==1) {
				$success = 'Successfully';
			}else {
				$success = 'Not Successfylly0';
			} 
		}else { 
			//echo 'This isn\'t Leap Year';
			$success = 'Successfully2';
		}
		
	}else{ 
		$success = 'Not Successfully';
	}

	if(isset($matches[0])){ 
		echo $matches[0].'<span style="color:green" class="one"> '.$success.'</span><br />';
	}else {
		echo $subject.'<span style="color:orange" class="two">'.$success.'</span><br />';
	}

}

Nie wiem za bardzo, czy tak powinno się pisać sprawdzanie daty razem z regexp'ami, ale niech już będzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1