Как извлечь и отформатировать определенные значения из строки

#php

#php

Вопрос:

У нас есть файлы, загруженные на наш сервер в определенном формате, который указывает версию и дату сборки, например: 5_5_61__20180828. dav

Первая группа чисел представляет версию 5_5_61 , а последняя группа чисел представляет дату сборки, 20180828 а затем .dav просто расширение файла.

Как бы мы могли извлечь и отформатировать это имя файла, чтобы оно выглядело следующим образом:

 Version: 5.5.61 Build Date: 08/28/2018
  

Я пробовал разные варианты этого фрагмента кода, но, похоже, не могу найти правильный метод:

 $file = '5_5_61__20180828.dav';
echo substr($file, strpos($file , "_")   1);
  

Я должен отметить, что я готов изменить имена файлов, если есть более простой способ достичь конечного результата, используя другое соглашение об именовании файлов.

Комментарии:

1.Если вы уверены, что имя файла всегда будет в одном и том же формате, я бы использовал регулярное выражение. /(d )_(d )_(d )__(d{4})(d{2})(d{2})/ php.net/manual/en/function.preg-match.php

Ответ №1:

Если вы знаете, что версии и даты разделены __ (двумя символами подчеркивания), это довольно просто.

Сначала разделите строку на __ (два подчеркивания) — это даст вам версию и дату с расширением. Снова разнесите последнюю часть, чтобы отделить дату от расширения. Затем замените _ (одно подчеркивание) на . в вашей версии и распечатайте все это.

Поскольку 20180828 это не стандартный формат даты для strtotime() функций, используйте DateTime::createFromFormat() для создания объекта date.

 $filename = '5_5_61__20180828.dav';
$parts = explode("__", $filename);
$parts2 = explode(".", $parts[1]);

$version = str_replce("_", ".", $parts[0]);
$date = $parts2[0];
$extension = $parts2[1];

$date = DateTime::createFromFormat("Ymd", $date)->format("m/d/Y");

echo "Version: $version. Build Date: $date";
  

Комментарии:

1. Второе значение explode (.) может быть заменено substr, поскольку длина даты фиксирована

2. Честно говоря, это тоже будет немного эффективнее. Вероятно, можно также свести все это испытание с разделением к регулярному выражению.

3. Да, регулярное выражение возможно, но не уверен, что это будет быстрее. (Но опять же, я не думаю, что этот код будет выполняться тысячи раз). Но я просто прокомментировал, поскольку добавление substr в строку DateTime может сделать код немного чище, чем отдельной строки. В целом, 1

4. Спасибо, именно то, что я искал!

5. Или просто $parts = explode("__", pathinfo($filename, PATHINFO_FILENAME));

Ответ №2:

https://ideone.com/a5Vudv

 $file = '5_5_61__20180828.dav';
$version =  str_replace("_", ".", substr($file, 0, -14));
$d = DateTime::createFromFormat("Ymd", substr($file, -12, 8))->format("m/d/Y");
echo 'Version: ' . $version . ' Build Date: '. $d;