PHP получить сложное расширение файла, как mysql-5.0.1.tar.gz - PullRequest
0 голосов
/ 03 июня 2010

Я столкнулся с типичной проблемой здесь. До сих пор я делал

strstr($filename,".");

$ filename - это файл, который я получил от $ _FILE, т.е. загруженный файл. Он работал нормально, пока не нажал имя файла указанного мной типа. Даже делая

pathinfo($filename);

дает мне

.gz 

Мне нужно посмотреть, точно ли это

.tar.gz

Ответы [ 5 ]

3 голосов
/ 03 июня 2010

Самый простой способ - это проверить последние 7 символов имени файла - это гарантирует, что каждый файл заканчивается на .tar.gz:

if (substr($filename, -7) == '.tar.gz') {
    // continue
}
3 голосов
/ 03 июня 2010

Технически, pathinfo является правильным: единственное расширение для этого файла .gz. Тот факт, что у него .tar в названии, совпадает с тем, что в нем 5.0.1.

Это не делает вас интересным для проверки .tar.gz файлов недействительными, но вызывает вопрос: что конкретно вы хотите найти?

Самое прямое решение вашего конкретного вопроса: сначала ищите расширение (через pathinfo или функцию strpos ), а затем, если оно окажется .gz, ищите "расширение" в оставшемся имени файла (по той же методике).

$parts = pathinfo($filename);
$extension = $parts['extension'];
if ($extension == '.gz') {
    $parts = pathinfo($parts['filename']);
    $extension = $parts['extension'] . $extension;
}
0 голосов
/ 20 декабря 2018

Я только что опубликовал следующую расширенную версию pathinfo() в комментариях к PHP.net . Эта версия группирует все части расширения файла как расширение (например, «tar.gz» вместо просто «gz»), оставляя остальное в качестве имени файла:

<?php
  function pathinfo_enhanced($file_path) {
    $core_path_info = pathinfo($file_path);
    $filename = $core_path_info['filename'];

    if (isset($core_path_info['extension'])) {
      $extension = $core_path_info['extension'];
    } else {
      $extension = '';
    }

    $extension_parts = array();

    while (!empty($extension)) {
      array_unshift($extension_parts, $extension);

      $remaining_path_info = pathinfo($filename);
      $filename = $remaining_path_info['filename'];

      if (isset($remaining_path_info['extension'])) {
        $extension = $remaining_path_info['extension'];
      } else {
        $extension = '';
      }
    }

    $revised_path_info = array(
      'filename'  => $filename,
      'extension' => implode('.', $extension_parts),
    );

    return array_merge($core_path_info, $revised_path_info);
  }

Вот несколько примеров, которые вы можете запустить, чтобы показать, как он обрабатывает различные случаи:

  // Directory; two extensions
  $path = '/www/htdocs/inc/file.tar.gz';
  $info = pathinfo_enhanced($path);

  echo "$path\n";
  print_r($info);
  echo "\n";

  // Directory; one extension
  $path = '/www/htdocs/inc/file.tgz';
  $info = pathinfo_enhanced($path);

  echo "$path\n";
  print_r($info);
  echo "\n";

  // Directory; no extension
  $path = '/www/htdocs/inc/lib';
  $info = pathinfo_enhanced($path);

  echo "$path\n";
  print_r($info);
  echo "\n";

  // No directory; one extension
  $path = 'test.php';
  $info = pathinfo_enhanced($path);

  echo "$path\n";
  print_r($info);
  echo "\n";

  // No directory; dot file
  $path = '.example';
  $info = pathinfo_enhanced($path);

  echo "$path\n";
  print_r($info);
  echo "\n";

  // Directory only
  $path = '/www/htdocs/inc/';
  $info = pathinfo_enhanced($path);

  echo "$path\n";
  print_r($info);
  echo "\n";
0 голосов
/ 09 июля 2014

ЭТО ответ:

strstr(pathinfo('asdasd/qweqwe/asdasd.tar.gz')['basename'], '.');

вернет вам '.tar.gz'

0 голосов
/ 03 июня 2010

И если вам нужно было разобрать 'this.is.a.very.long.file.name.with.lots.of.full.stops', то что это за расширение файла? Полагаться на определенную часть имени файла для передачи семантической, машиночитаемой информации о содержимом файла в лучшем случае опасно.

Непонятно, в чем проблема, которую вы пытаетесь решить - зачем вам знать, что это за расширение?

С

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...