从路径中提取文件名

时间:2010-07-19 02:26:20

标签: php regex

我需要从文件路径字符串中获取文件名。例如,从此字符串\abc\def\filename.txt我需要获取filename.txt

尝试使用regexp执行此操作:

$filepath="abc\filename.txt";
$filename = preg_replace("/.+\\/","",$filepath);

但它给了我一个错误。我应该用什么正则表达式解决这个问题?

5 个答案:

答案 0 :(得分:35)

你应该使用函数basename:

$filepath = 'abc\filename.txt';
$filename = basename($filepath);

编辑:重要提示,当你的字符串中有反斜杠时,你需要使用单引号,否则正确地将它们转义。

注意:此不会工作:

$filepath = "abc\filename.txt";
$filename = basename($filepath);

因为你是变量$ filepath infact hold:

abc[special char here equalling \f]ilename.txt

另一个编辑: 这个正则表达式也有效..

$filepath = '\def\abc\filename.txt';
$basename = preg_replace('/^.+\\\\/', '', $filepath);

你原版的所有错误都是你有双引号而不是单引号,反斜杠需要双重转义(\\而不是\)。

答案 1 :(得分:3)

这应该这样做:

$filepath='abc\filename.txt';
$basename = preg_replace('/^.+[\\\\\\/]/', '', $filepath);
echo $basename;

<强>结果:

filename.txt

答案 2 :(得分:3)

两个解决方案:

  1. preg_match()
  2. str_replace()pathinfo()

  3. 1:preg_match()

    好的,问题是你使用的是反斜杠。您必须确保不使用双引号来定义文件路径,因为反斜杠被解释为转义序列。使用单引号。

    此外,使用正则表达式,通过从路径的后面移动直到你遇到反斜杠来获取文件名非常简单....诀窍是反斜杠是\\\\ .. {{3 }}

    最后,您不想使用preg_replace。只需使用preg_match找到文件名:

    <?php
      // Use single quotes or the backslash will be interpreted as an esacpe sequence
    $filepath = '\abc\def\filename.txt';
    
      // You have to use 4 backslashes to represent your single backslash 
      // The regex picks the characters that are NOT \ from the end of the path
    $pattern = '/[^\\\\]+$/';
    
      // Use $matches to store the match
    preg_match($pattern, $filepath, $matches);
    
      // Display answer now, or use later
    echo $matches[0];
    ?>
    

    2:here's why str_replace()

    正如其他人所说,basename()是一个不错的选择。另一种选择,如果您有可能还需要稍后的目录或其他路径信息,请使用pathinfo()

    问题是basename和pathinfo都采用正斜杠,所以你必须将反斜杠转换为正斜杠:

    示例:

    <?php
      // Make sure to use single quotes
    $filepath='abc\filename.txt';
      // Replace backslash with forward slash
    $filepath = str_replace('\\', '/', $filepath);
    $path_parts = pathinfo($filepath);
    
      // This is the answer you want
    echo $path_parts['basename'], "\n";
    
      // But you also have access to these
    echo $path_parts['dirname'], "\n";
    echo $path_parts['extension'], "\n";
    echo $path_parts['filename'], "\n"; // since PHP 5.2.0
    ?>
    

答案 3 :(得分:1)

preg_replace("/[^\/]+.([^\.]+\.[a-z]{3,5})/i","$1","abc/filename.txt"); //return filename.txt

答案 4 :(得分:0)

为什么要把正则表达式抛到这么简单的问题上呢?

$source = "/i/am/a/path.txt";
$pos = strrpos($source, '/');
$result = substr($source, $pos === FALSE ? 0 : $pos);
编辑:我没有尝试过这个 - 我没有方便的PHP服务器。使用substr和strrpos 可能是一个一个一个错误,但如果是这种情况,你只需在$pos中添加或减去一个。

EDIT2:这是一个反斜杠版本:

$source = "\\i\\am\\a\\path.txt";
$pos = strrpos($source, '\\');
$result = substr($source, $pos === FALSE ? 0 : $pos);