从路径中提取文件名

nuk*_*ukl 12 php regex

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

尝试使用regexp执行此操作:

$filepath="abc\filename.txt";
$filename = preg_replace("/.+\\/","",$filepath);
Run Code Online (Sandbox Code Playgroud)

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

nat*_*han 35

你应该使用函数basename代替:

$filepath = 'abc\filename.txt';
$filename = basename($filepath);
Run Code Online (Sandbox Code Playgroud)

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

注意:这不会工作:

$filepath = "abc\filename.txt";
$filename = basename($filepath);
Run Code Online (Sandbox Code Playgroud)

因为你是变量$ filepath infact持有:

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

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

$filepath = '\def\abc\filename.txt';
$basename = preg_replace('/^.+\\\\/', '', $filepath);
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*tai 5

两种解决方案:

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

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];
?>
Run Code Online (Sandbox Code Playgroud)

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
?>
Run Code Online (Sandbox Code Playgroud)