【问题标题】:extract filename from path [duplicate]从路径中提取文件名[重复]
【发布时间】:2010-07-19 02:26:19
【问题描述】:

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

尝试使用正则表达式:

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

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

【问题讨论】:

  • 没有理由使用 preg_replace 将字符替换为空。只使用 preg_match 更直接。 (见我的回答如何)。

标签: php regex


【解决方案1】:

您应该改用函数 basename:

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

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

注意:这个不会工作:

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

因为你是变量 $filepath 实际上持有:

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

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

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

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

【讨论】:

  • @nathan:那不行,它会给你abcilename.txt
  • @sAc:它对我来说非常适合。
  • @casablanca:希望其他人也尝试该代码 :) 不过似乎对我不起作用。
  • @nathan:我相信问题出在路径中的\`, the basename worked fine with /` 中。
  • @sAc 很好地修复了你的 q,basename 的修复现在正在编辑中 - 让我们困惑了一分钟!
【解决方案2】:

两种解决方案:

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

1:preg_match()

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

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

最后,您不想使用 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:str_replace()pathinfo()

正如其他人所说,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
?>

【讨论】:

  • 那也行不通,他还需要他指出的正则表达式解决方案。
  • @sAc 我认为 OP 表明正则表达式运行得不是很好...... gtg 但会尝试一些
  • 只有在路径中使用斜杠 (/) 而不是反斜杠时才有效。现在 +1 :)
  • @sAc 感谢您的提醒。我使用一个非常简单的正则表达式重写了代码,它只是从路径后面获取所有不是反斜杠的字符。另外,用斜线替换修复了原始代码。
【解决方案3】:

应该这样做:

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

结果:

filename.txt

【讨论】:

  • 这不适用于文件路径\abc\def\filename.txt,它将返回'def\filename.txt
  • @nathan:我相信问题出在路径中的\`, it works fine with /
【解决方案4】:
preg_replace("/[^\/]+.([^\.]+\.[a-z]{3,5})/i","$1","abc/filename.txt"); //return filename.txt

【讨论】:

    【解决方案5】:

    为什么要在这么简单的问题上扔正则表达式?

    $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);
    

    【讨论】:

    • OP 有反斜杠,所以你不能双引号 $source 并且你必须在 $pos 中转义反斜杠
    • @Peter:添加了反斜杠版本。
    猜你喜欢
    • 2013-08-19
    • 2010-10-01
    • 2014-04-08
    • 2016-06-19
    • 2018-11-16
    • 2016-10-07
    相关资源
    最近更新 更多