Мне нужно получить имя файла из строки пути к файлу. Например, из этой строки \abc\def\filename.txt
мне нужно получить filename.txt
пытаясь сделать это с помощью regexp:
$filepath="abc\filename.txt"; $filename = preg_replace("/.+\\/","",$filepath);
но это дает мне ошибку. Какое регулярное выражение я должен использовать для решения этой проблемы?
вместо этого вы должны использовать базовое имя функции:
$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 ()
Итак, проблема в том, что вы используете обратную косую черту. Вы должны убедиться, что вы не используете двойные кавычки для определения пути к файлу, поскольку обратная косая черта интерпретируется как 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);