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

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

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

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

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

Solutions Collecting From Web of "извлечь имя файла из пути"

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

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

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

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

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

Результат:

 filename.txt 

Два решения:

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

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 ?> 
 preg_replace("/[^\/]+.([^\.]+\.[az]{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); 

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

EDIT2: Вот версия обратной косой черты:

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