#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";
- Живая демонстрация на https://3v4l.org/4Lk2T
Комментарии:
1. Второе значение explode (.) может быть заменено substr, поскольку длина даты фиксирована
2. Честно говоря, это тоже будет немного эффективнее. Вероятно, можно также свести все это испытание с разделением к регулярному выражению.
3. Да, регулярное выражение возможно, но не уверен, что это будет быстрее. (Но опять же, я не думаю, что этот код будет выполняться тысячи раз). Но я просто прокомментировал, поскольку добавление substr в строку DateTime может сделать код немного чище, чем отдельной строки. В целом, 1
4. Спасибо, именно то, что я искал!
5. Или просто
$parts = explode("__", pathinfo($filename, PATHINFO_FILENAME));
Ответ №2:
$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;