我需要从文件路径字符串中获取文件名。例如,从此字符串\abc\def\filename.txt
我需要获取filename.txt
尝试使用regexp执行此操作:
$filepath="abc\filename.txt";
$filename = preg_replace("/.+\\/","",$filepath);
但它给了我一个错误。我应该用什么正则表达式解决这个问题?
答案 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)
两个解决方案:
好的,问题是你使用的是反斜杠。您必须确保不使用双引号来定义文件路径,因为反斜杠被解释为转义序列。使用单引号。
此外,使用正则表达式,通过从路径的后面移动直到你遇到反斜杠来获取文件名非常简单....诀窍是反斜杠是\\\\
.. {{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];
?>
正如其他人所说,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);