我需要从文件路径字符串中获取文件名。例如,从这个字符串\abc\def\filename.txt
,我需要获取filename.txt
。
尝试使用正则表达式实现:
$filepath="abc\filename.txt";
$filename = preg_replace("/.+\\/","",$filepath);
但它会报错。我应该使用什么正则表达式来解决这个问题?
你应该使用函数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);
你原来的问题只在于你使用了双引号而不是单引号,并且反斜杠需要双重转义(\\ 而不是 \)。
abcilename.txt
。 - Sarfraz\\
上,basename在路径中使用/
是正常的。 - Sarfraz\f
。 - casablanca两种解决方案:
1: preg_match()
好的,问题在于你正在使用反斜杠。你必须确保不要使用双引号来定义文件路径,因为反斜杠会被解释为转义序列。使用单引号。
此外,使用正则表达式更容易通过从路径末尾移动直到遇到反斜杠来获取文件名...诀窍是反斜杠是\\\\
.. 这里有原因
最后,不要使用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
?>
$filepath='abc\filename.txt';
$basename = preg_replace('/^.+[\\\\\\/]/', '', $filepath);
echo $basename;
结果:
filename.txt
\abc\def\filename.txt
是行不通的,它会返回"def\filename.txt
"。 - nathan\\
上,如果路径中使用 /
就可以正常工作。 - Sarfrazpreg_replace("/[^\/]+.([^\.]+\.[a-z]{3,5})/i","$1","abc/filename.txt"); //return filename.txt
$source = "/i/am/a/path.txt";
$pos = strrpos($source, '/');
$result = substr($source, $pos === FALSE ? 0 : $pos);
编辑:我还没有尝试过这个方法——我手头没有一个可用的PHP服务器。substr和strrpos可能存在一种偏移量错误,但如果是这种情况,您只需从$pos
中加上或减去1即可。
编辑2:这里是反斜杠版本:
$source = "\\i\\am\\a\\path.txt";
$pos = strrpos($source, '\\');
$result = substr($source, $pos === FALSE ? 0 : $pos);