Извлекать имя файла из пути
Мне нужно получить имя файла из строки пути к файлу. Например, из этой строки \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);