PHP:没有文件扩展名的文件名-最佳方法?

12

我正在尝试从目录中获取没有扩展名的文件名。

我正在使用以下方法进行处理:

foreach ($allowed_files as $filename) { 
  $link_filename = substr(basename($filename), 4, strrpos(basename($filename), '.'));
  $src_filename = substr($link_filename, 0, strrpos($link_filename) - 4);
  echo $src_filename;
}

但是如果扩展字符串长度超过3,那就行不通了。我在PHP文档中找了一圈也没有结果。

4个回答

20

PHP提供了一个方便的pathinfo()函数,可以为您完成这项工作:

foreach ($allowed_files as $filename) {
  echo pathinfo($filename, PATHINFO_FILENAME);
}

示例:

$files = array(
  'somefile.txt',
  'anotherfile.pdf',
  '/with/path/hello.properties',
);

foreach ($files as $file) {
  $name = pathinfo($file, PATHINFO_FILENAME);
  echo "$file => $name\n";
}

输出:

somefile.txt => somefile
anotherfile.pdf => anotherfile
/with/path/hello.properties => hello

pathinfo($filename, PATHINFO_BASENAME) 和 basename($filename) 有什么区别? - jml
我打错了。PATHINFO_BASENAME与basename()相同。你需要的是PATHINFO_FILENAME(已更新)。 - cletus
我认为你在输出时也有一个错别字- 应该是 $file => $name . "\n"; 对吗?或者你可以使用 PHP 的内部变量的字符串表示形式吗? - jml
嗯,实际上这对我似乎不起作用。当我在类似于您发布的文件数组的字符串或包括文件扩展名(即“happy.jpg”)的自选解析字符串上执行操作时,我什么也没有返回。 - jml
1
@jml: 不,上述代码是正确的。请参考 http://php.net/manual/en/language.types.string.php,尤其是 http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double 中关于PHP字符串语法的内容。 - cletus

3

试试这个

function file_extension($filename){
    $x = explode('.', $filename);
    $ext=end($x);
    $filenameSansExt=str_replace('.'.$ext,"",$filename);
    return array(
        "filename"=>$filenameSansExt,
        "extension"=>'.'.$ext,
        "extension_undotted"=>$ext
        );
}

使用方法:

$filenames=array("file1.php","file2.inc.php","file3..qwe.e-rt.jpg");
foreach($filenames as $filename){
    print_r(file_extension($filename));
    echo "\n------\n";

}

输出

Array
(
    [filename] => file1
    [extension] => .php
    [extension_undotted] => php
)

------
Array
(
    [filename] => file2.inc
    [extension] => .php
    [extension_undotted] => php
)

------
Array
(
    [filename] => file3..qwe.e-rt
    [extension] => .jpg
    [extension_undotted] => jpg
)

------

谢谢这个。知道如何使用自定义函数解决问题很好。 - jml

2

list($file) = explode('.', $filename);


1
blah.class.php 是什么? - nickf
嗨,dmitrig01- 在这种情况下,list($file)是什么?是任何变量吗? - jml
我会这样做,并在分割后删除最后一个元素。 - wenbert
我不知道如何删除最后一个元素。你能否提供一个使用这个语法的例子? - jml
2
我的代码只保留第一个元素。list($file)表示“取第一个元素并将其放入变量$file”。 如果您想要除最后一个元素外的所有元素,请使用substr($filename, 0, strrpos($filename, '.')); - dmitrig01

1

试试这个:

$noExt = preg_replace("/\\.[^.]*$/", "", $filename);

针对Cletus的评论进行修改:
您可以通过以下几种方式之一来更改:

$noExt = preg_replace("/\\.[^.]*$/", "", basename($filename));

// or

$noExt = preg_replace("/\\.[^.\\\\\\/]*$/", "", $filename);

是的,PHP需要正则表达式字面量...


我发现这是最有用的,因为你是在字符串本身上操作。当你确切地知道要修改的字符串时,采用正则表达式方法似乎非常有用。 - jml
-1 这是一个很好的例子,说明为什么不应该重新发明 PHP 已经具备内置函数的轮子。那么 "/some/path.to/afile" 这个字符串呢? - cletus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接