Разобрать формат даты из строки даты PHP - PullRequest
2 голосов
/ 28 февраля 2020

Я пытаюсь добиться этого:

getFormat("Jan 2020") // returns: M Y
getFormat("01 Feb 2020") // returns: d M Y
getFormat("01-January-2020") // returns: d-F-Y

Идея состоит в том, чтобы в основном провести обратный инжиниринг php даты

Это то, что я пробовал до сих пор:

public function getFormat($date){
    $date = strtolower($date);
    $formats = array(
        "F" => array("january","february","march","april","may","june","july","august","september","october","november","december"),
        "M" => array("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"),
    );

    foreach($formats as $format=>$data) {
        foreach($data as $d)
            if (stripos($date,$d) !== false) $date = str_replace($d,$format,$date);
    }
    return $date;
}

Это будет работать месяцами или днями, но я не думаю, что этот метод будет работать для чисел c.

1 Ответ

1 голос
/ 01 марта 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...