date_parse () проверяет, существуют ли день, месяц и год в формате. Части заменяются символами формата с использованием регулярных выражений в массиве config.
Это не идеальное решение. Это подход, который можно улучшить.
function getDateFormat($format){
$parse = date_parse($format);
if($parse['error_count']) return false;
$conf = [
'~\d{4}~' => ['year','Y'],
'~[a-z]{4,8}~i' => ['month','F'],
'~[a-z]{3}~i' => ['month','M'],
'~(?<=[ /\-\.])\d{2}(?=[ /\-\.])~' => ['month','m'],
'~\d{1,2}(?=[,])~' => ['day','j'],
'~\d{2}~' => ['day','d'],
'~\d{1}~' => ['day','j'],
];
foreach($conf as $regEx => $types){
if($parse[$types[0]] !== false) {
$format = preg_replace($regEx, $types[1], $format, 1, $count);
if($count) $parse[$types[0]] = false; ;
}
}
return $format;
}
Я не полностью проверил, какие выражения функция может обрабатывать правильно. Вот несколько примеров:
$data = [
"Jan 2020","01 Feb 2020","01-January-2020",
"2020-03-02","05.06.1987", "April 6, 1967",
"1988", "5. July 1966",
"is a Error"
];
foreach($data as $format){
$frm = getDateFormat($format);
echo $format." : ".($frm ? $frm : "ERROR")."<br>";
}
Вывод:
Jan 2020 : M Y
01 Feb 2020 : d M Y
01-January-2020 : d-F-Y
2020-03-02 : Y-m-d
05.06.1987 : d.m.Y
April 6, 1967 : F j, Y
1988 : Y
5. July 1966 : j. F Y
is a Error : ERROR