PHP:从路径中删除文件名

45

假设我有一个路径:images/alphabet/abc/23345.jpg

如何从路径中删除文件名,以便得到:images/aphabet/abc/

4个回答

73

4
如果路径是“images/alphabet/abc/”,该怎么办? - zPuls3
1
@zPuls3 “给定一个包含文件或目录路径的字符串,此函数将返回父目录的路径。” - Byron Whitlock
1
我不同意这个观点。从路径中删除文件名!==父文件夹名称。@abney317应该是正确的答案。 - Machado
dirname() 只会返回父文件夹,如果路径末尾没有文件名,它将失败。 - Machado

28

dirname() 只会返回父文件夹的名称,因此在dirname() 无法处理时,pathinfo() 却可以。

如果需要获取完整路径信息,应使用 pathinfo()函数:

$dirname = pathinfo('images/alphabet/abc/23345.jpg', PATHINFO_DIRNAME);

PATHINFO_DIRNAME 告诉 pathinfo 直接返回 dirname

看一些例子:

  • 对于路径 images/alphabet/abc/23345.jpg,两种方式都可以:

    <?php
    
    $dirname = dirname('images/alphabet/abc/23345.jpg'); 
    // $dirname === 'images/alphabet/abc/'
    
    $dirname = pathinfo('images/alphabet/abc/23345.jpg', PATHINFO_DIRNAME); 
    // $dirname === 'images/alphabet/abc/'
    
  • 对于路径images/alphabet/abc/,如果dirname失败:

  • <?php
    
    $dirname = dirname('images/alphabet/abc/'); 
    // $dirname === 'images/alphabet/'
    
    $dirname = pathinfo('images/alphabet/abc/', PATHINFO_DIRNAME); 
    // $dirname === 'images/alphabet/abc/'
    

1
你测试过示例吗?dirname()pathinfo() 总是返回没有结尾斜杠的路径。至少在 PHP 8.0 中,dirname()pathinfo() 给出了相同的结果。对于 'images/alphabet/abc/',这两个函数都返回 "images/alphabet"。因此当前它们之间没有区别。 - Paul Melekhov
@PaulMelekhov,请看答案日期,显然它不是在PHP 8.0中测试的。现在如果你问我,它可能是在PHP 5.6或5.4中测试的,并且这些评论是手写的,它们旨在说明答案而不是成为某个输出副本,因此您可以忽略尾随斜杠或建议编辑答案。 - Machado

19

0
请注意,当一个字符串只包含文件名而没有路径(例如"test.txt")时,dirname()pathinfo()函数返回单个点(".")作为目录,而不是空字符串。如果你的字符串以"/"结尾,即当一个字符串仅包含路径而没有文件名时,这些函数会忽略此结束斜杠并返回父目录。在某些情况下,这可能是不希望的行为,您需要使用其他方法。例如,如果您的路径可能只包含正斜杠"/",即仅有一种变体(不是正斜杠"/"和反斜杠"\"都有),则可以使用此函数:
function stripFileName(string $path): string
{
    if (($pos = strrpos($path, '/')) !== false) {
        return substr($path, 0, $pos);
    } else {
        return '';
    }
}

或者用更简短但不那么清晰的方式:

function stripFileName(string $path): string
{
    return substr($path, 0, (int) strrpos($path, '/'));
}

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