PHP isDate, checks for valid date, redux 3

I just can't leave well enough alone. This third iteration of the PHP isDate function is a little more concise, and makes changing acceptable formats a little easier. The function signature stays the same, accepting a date, and the expected format of the date, using PHP date expressions.

#accepts a date, and a date format (not a regular expression)
function isDate($d, $f='%d-%m-%Y %H:%M'){
	$dateFmtRE = array(
		'/\//' => '\/',
		'/%d|%e/' => '(0?[1-9]|[12][0-9]|3[01])',
		'/%m/' => '(0?[1-9]|1[012])',
		'/%g|%G|%y|%Y/' => '(19\d\d|20\d\d)',
		'/%H|%I|%l/' => '([0-1]?\d|2[0-3])',
		'/%M/' => '([0-5]\d)');
	if (empty($d))  return true;

	#convert Unix timestamp to a std format (must not include regular expressions)
	if (preg_match('!\d{5,}!', $d))
		$d = strftime($f, $d);

	return (
		#does %d match the regular expression version of $f? if it does m/d/y are in $x
		preg_match('!^' .preg_replace(array_keys($dateFmtRE), array_values($dateFmtRE),$f) .'$!', $d, $x)
		&& (checkdate($x[2], $x[1], $x[3]) || checkdate($x[1], $x[2], $x[3]) || checkdate($x[3], $x[1], $x[2]))
		?true :false);