1 date.inc | date_limit_format($format, $granularity) |
Limits a date format to include only elements from a given granularity array.
Example: date_limit_format('F j, Y - H:i', array('year', 'month', 'day')); returns 'F j, Y'
Parameters
string $format: A date format string.
array $granularity: An array of allowed date parts, all others will be removed.
Return value
string: The format string with all other elements removed.
File
- core/
includes/ date.inc, line 1164 - Date API functions.
Code
function date_limit_format($format, $granularity) {
// Use the advanced backdrop_static() pattern to improve performance.
static $backdrop_static_fast;
if (!isset($backdrop_static_fast)) {
$backdrop_static_fast['formats'] = &backdrop_static(__FUNCTION__);
}
$formats = &$backdrop_static_fast['formats'];
$format_granularity_cid = $format . '|' . implode(',', $granularity);
if (isset($formats[$format_granularity_cid])) {
return $formats[$format_granularity_cid];
}
// If punctuation has been escaped, remove the escaping. Done using strtr()
// because it is easier than getting the escape character extracted using
// preg_replace().
$replace = array(
'\-' => '-',
'\:' => ':',
"\'" => "'",
'\. ' => ' . ',
'\,' => ',',
);
$format = strtr($format, $replace);
// Get the 'T' out of ISO date formats that don't have both date and time.
if (!date_has_time($granularity) || !date_has_date($granularity)) {
$format = str_replace('\T', ' ', $format);
$format = str_replace('T', ' ', $format);
}
$regex = array();
if (!date_has_time($granularity)) {
$regex[] = '((?<!\\\\)[a|A])';
}
// Create regular expressions to remove selected values from string.
// Use (?<!\\\\) to keep escaped letters from being removed.
foreach (date_nongranularity($granularity) as $element) {
switch ($element) {
case 'year':
$regex[] = '([\-/\.,:]?\s?(?<!\\\\)[Yy])';
break;
case 'day':
$regex[] = '([\-/\.,:]?\s?(?<!\\\\)[l|D|d|dS|j|jS|N|w|W|z]{1,2})';
break;
case 'month':
$regex[] = '([\-/\.,:]?\s?(?<!\\\\)[FMmn])';
break;
case 'hour':
$regex[] = '([\-/\.,:]?\s?(?<!\\\\)[HhGg])';
break;
case 'minute':
$regex[] = '([\-/\.,:]?\s?(?<!\\\\)[i])';
break;
case 'second':
$regex[] = '([\-/\.,:]?\s?(?<!\\\\)[s])';
break;
case 'timezone':
$regex[] = '([\-/\.,:]?\s?(?<!\\\\)[TOZPe])';
break;
}
}
// Remove empty parentheses, brackets, pipes.
$regex[] = '(\(\))';
$regex[] = '(\[\])';
$regex[] = '(\|\|)';
// Remove selected values from string.
$format = trim(preg_replace($regex, array(), $format));
// Remove orphaned punctuation at the beginning of the string.
$format = preg_replace('`^([\-/\.,:\'])`', '', $format);
// Remove orphaned punctuation at the end of the string.
$format = preg_replace('([\-/,:\']$)', '', $format);
$format = preg_replace('(\\$)', '', $format);
// Trim any whitespace from the result.
$format = trim($format);
// After removing the non-desired parts of the format, test if the only things
// left are escaped, non-date, characters. If so, return nothing.
// Using S instead of w to pick up non-ASCII characters.
$test = trim(preg_replace('(\\\\\S{1,3})u', '', $format));
if (empty($test)) {
$format = '';
}
// Store the return value in the static array for performance.
$formats[$format_granularity_cid] = $format;
return $format;
}