php获取复杂的文件扩展名,如mysql-5.0.1.tar.gz

php获取复杂的文件扩展名,如mysql-5.0.1.tar.gz,php,file,upload,Php,File,Upload,我遇到了一个典型的问题。直到现在我还在做 strstr($filename,"."); $filename是我从$_file(即上载的文件)获得的文件。在我找到我提到的文件名类型之前,它一直运行良好。 甚至做 pathinfo($filename); 给我 .gz 我需要看看它是否准确 .tar.gz 从技术上讲,pathinfo是正确的:该文件的唯一扩展名是.gz。它的名称中有.tar,这一事实与它的名称中有5.0.1一样巧合 这并不意味着你对检查.tar.gz文件的兴趣是无效的,但

我遇到了一个典型的问题。直到现在我还在做

strstr($filename,".");
$filename是我从$_file(即上载的文件)获得的文件。在我找到我提到的文件名类型之前,它一直运行良好。 甚至做

pathinfo($filename);
给我

.gz 
我需要看看它是否准确

.tar.gz

从技术上讲,
pathinfo
是正确的:该文件的唯一扩展名是
.gz
。它的名称中有
.tar
,这一事实与它的名称中有
5.0.1
一样巧合

这并不意味着你对检查
.tar.gz
文件的兴趣是无效的,但它确实提出了一个问题:你到底想找到什么

对于您的特定问题,最直接的解决方案是:首先查找扩展名(通过
pathinfo
或函数),然后如果它恰好是
.gz
则在剩余文件名中查找“扩展名”(通过相同的技术)


从技术上讲,
pathinfo
是正确的:该文件的唯一扩展名是
.gz
。它的名称中有
.tar
,这一事实与它的名称中有
5.0.1
一样巧合

这并不意味着你对检查
.tar.gz
文件的兴趣是无效的,但它确实提出了一个问题:你到底想找到什么

对于您的特定问题,最直接的解决方案是:首先查找扩展名(通过
pathinfo
或函数),然后如果它恰好是
.gz
则在剩余文件名中查找“扩展名”(通过相同的技术)


如果需要解析“this.is.a.very.long.file.name.with.lots.of.full.stops”,那么文件扩展名是什么?依靠文件名的特定部分来传递有关文件内容的语义、机器可读信息,充其量是危险的

不清楚您尝试的问题是什么-为什么您需要知道扩展是什么


C.

如果需要解析“this.is.a.very.long.file.name.with.lots.of.full.stops”,那么文件扩展名是什么?依靠文件名的特定部分来传递有关文件内容的语义、机器可读信息,充其量是危险的

不清楚您尝试的问题是什么-为什么您需要知道扩展是什么


C.

最简单的方法是检查文件名的最后7个字符-这确保每个文件都以
.tar.gz
结尾:

if (substr($filename, -7) == '.tar.gz') {
    // continue
}

最简单的方法是检查文件名的最后7个字符-这确保每个文件都以
.tar.gz
结尾:

if (substr($filename, -7) == '.tar.gz') {
    // continue
}
答案是:

strstr(pathinfo('asdasd/qweqwe/asdasd.tar.gz')['basename'], '.');
将返回您的“.tar.gz”

答案如下:

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

将返回您“.tar.gz”

我刚刚在上的评论中发布了以下增强版的
pathinfo()
。此版本将文件扩展名的所有部分归为扩展名(例如,“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);
  }

我刚刚在上的评论中发布了以下增强版的
pathinfo()
。此版本将文件扩展名的所有部分归为扩展名(例如,“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);
  }

我有一个上传表单,限制用户只上传.tar.gz档案。不允许使用其他文件类型。因此,当他上传mysql-5.0.1.tar.gz之类的东西时,我的脚本会说由于上述逻辑,文件类型无效。我需要从该文件名中提取“.tar.gz”部分。。。因此,您的解决方案不适合使用,因为文件名与其内容无关。如果要验证内容,请检查“tar-tvzf$uploaded_file”是否返回错误。下载时强制使用以.tar.gz或tgz结尾的文件名。是的,稍后会进行内容验证。如果提取失败,我将返回一个错误。我只是检查文件扩展名是否为.tar.gz。基本上节省了一步。如果不是。tar.gz,甚至不应该麻烦提取。这不是一种很健康的方式,但也可以。。因此,如果用户故意命名一个以tar.gz结尾的文件,则在提取时将失败。然后检查stripos($filename,'.tar.gz')==strlen('.tar.gz'),我有一个上载表单,其中我限制用户只上载.tar.gz存档。不允许使用其他文件类型。因此,当他上传mysql-5.0.1.tar.gz之类的东西时,我的脚本会说由于上述逻辑,文件类型无效。我需要从该文件名中提取“.tar.gz”部分。。。因此,您的解决方案不适合使用,因为文件名与其内容无关。如果要验证内容,请检查“tar-tvzf$uploaded_file”是否返回错误。下载时强制使用以.tar.gz或tgz结尾的文件名。是的,稍后会进行内容验证。如果提取失败,我将返回一个错误。我只是检查文件扩展名是否为.tar.gz。基本上节省了一步。如果不是。tar.gz,甚至不应该麻烦提取。这不是一种很健康的方式,但也可以。。因此,如果用户故意命名一个以tar.gz结尾的文件,则在提取时将失败。然后检查stripos($filename,'.tar.gz')==strlen('.tar.gz'),我只查找扩展名为.tar.gz的文件,即它们应该以.tar.gz结尾。所以像这样的任何文件.is.a.long.filename.tar.gz都应该是有效的..我只查找扩展名为.tar.gz的文件,即它们应该以.tar.gz结尾。所以像这样的任何文件.is.a.long.filename.tar.gz都应该是有效的..这就是答案吗?我不敢相信我的眼睛,你让我的一天,斯特凡)这是答案吗?我不敢相信我的眼睛(你让我开心,斯特凡)