Извлекать имя файла из пути

Мне нужно получить имя файла из строки пути к файлу. Например, из этой строки \abc\def\filename.txt мне нужно получить filename.txt

пытается сделать это с помощью regexp:

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

но это дает мне ошибку. Какое регулярное выражение я должен использовать для решения этой проблемы?

Ответ 1

вместо этого вы должны использовать базовое имя функции:

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

edit: важно отметить, вам нужно использовать одинарные кавычки, когда у вас есть обратные косые черты в ваших строках, иначе их можно избежать.

Примечание: это не сработает:

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

все, что было не так с вашим оригиналом, заключалось в том, что у вас были двойные кавычки, а не одиночные, а обратная косая черта требует двойного экранирования (\\, а не \).

Ответ 2

Это должно сделать это:

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

Результат:

filename.txt

Ответ 3

Два решения:


1: preg_match()

Итак, проблема в том, что вы используете обратную косую черту. Вы должны убедиться, что вы не используете двойные кавычки для определения вашего пути к файлу, так как обратная косая черта интерпретируется как escape-последовательность. Используйте одинарные кавычки.

Кроме того, с регулярным выражением, очень просто получить имя файла, переместившись с обратной стороны пути, пока вы не нажмете обратную косую черту... Фокус в том, что обратная косая черта \\\\.. вот почему

Наконец, вы не хотите использовать 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
?>

Ответ 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);

EDIT: я не пробовал это - у меня нет рабочего сервера PHP. Там может быть вне очереди с substr и strrpos, но если это случай, вы просто добавляете или вычитаете один из $pos.

EDIT2: здесь обратная косая черта:

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