PHP, получить имя файла без расширения файла
у меня есть этот PHP код:
function ShowFileExtension($filepath)
{
preg_match('/[^?]*/', $filepath, $matches);
$string = $matches[0];
$pattern = preg_split('/./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);
if(count($pattern) > 1)
{
$filenamepart = $pattern[count($pattern)-1][0];
preg_match('/[^?]*/', $filenamepart, $matches);
return strtolower($matches[0]);
}
}
если у меня есть файл с именем my.zip эта функция возвращает .zip.
Я хочу сделать обратное, я хочу, чтобы функция возвратила my без расширения.
файл-это просто строка в переменной.
17 ответов:
нет необходимости во всем этом. Проверьте pathinfo(), это дает вам все компоненты вашего пути.
пример из руководства:
$path_parts = pathinfo('/www/htdocs/index.html'); echo $path_parts['dirname'], "\n"; echo $path_parts['basename'], "\n"; echo $path_parts['extension'], "\n"; echo $path_parts['filename'], "\n"; // filename is only since PHP 5.2.0вывод кода:
/www/htdocs index.html html indexи в качестве альтернативы вы можете получить только определенные части, такие как:
echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html
в качестве альтернативы
pathinfo(), вы можете использовать
basename()- возвращает имя файла компонента pathпример из руководства PHP
$path = "/home/httpd/html/index.php"; $file = basename($path); // $file is set to "index.php" $file = basename($path, ".php"); // $file is set to "index"вы должны знать, что расширение если удалить его заранее.
однако, поскольку ваш вопрос предполагает, что у вас есть необходимость в получении расширения и базовое имя, я бы проголосовал Пекки как самый полезный, потому что это даст вам любую информацию, которую вы хотите о пути и файле с одной собственной функцией.
http://php.net/manual/en/function.pathinfo.php
pathinfo($path, PATHINFO_FILENAME);простой функциональный тест:http://ideone.com/POhIDC
другой подход заключается в использовании регулярных выражений.
$fileName = basename($filePath); $fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);это удаляет из последнего периода
.до конца строки.
если расширение неизвестно, используйте это решение
pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname" pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname" pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname" pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"
@Gordon basename будет работать нормально, если вы знаете расширение, если вы не можете использовать explode:
$filename = end(explode(".", $file));
почти все вышеперечисленные решения имеют показанное получение имени файла из переменной $path
ниже фрагмент будет получить текущее имя исполняемого файла без расширения
echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);объяснение
$_SERVER ['SCRIPT_NAME'] содержит путь к текущему скрипту.
@огонь упаковывать имя файла использует точки, вы можете получить неправильный вывод. Я бы использовал метод @Gordon, но также получил расширение, поэтому функция basename работает со всеми расширениями, например:
$path = "/home/httpd/html/index.php"; $ext = pathinfo($path, PATHINFO_EXTENSION); $file = basename($path, ".".$ext); // $file is set to "index"
в моем случае, я использую ниже. Мне все равно, каково его расширение. :Д я думаю, что это поможет вам
$exploded_filepath = explode(".", $filepath_or_URL); $extension = end($exploded_filepath); echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.
нет необходимости писать много кода. Даже это можно сделать всего одной строкой кода. Смотрите здесь
Ниже приведен код одной строки, который возвращает только имя файла и удаляет имя расширения:
<?php echo pathinfo('logo.png')['filename']; ?>Он будет печатать
logoисточник: удалить расширение и вернуть только имя файла в PHP
имя файла без расширения файла, когда вы не знаете, что расширения:
$basename = substr($filename, 0, strrpos($filename, "."));
Если вы не знаете, какое расширение у вас есть, тогда вы можете попробовать это:
$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1)); echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" onlyработа со всеми возможностями:
image.jpg // output: "image" filename.image.png // output: "filename.image" index.php // output: "index"
вы можете написать это
$filename = current(explode(".", $file));они вернут текущий элемент массива, если он не использовался ранее.
ваш ответ находится ниже идеального решения, чтобы скрыть расширение файла в php.
<?php $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; echo basename($path, ".php"); ?>
Это возвращает только имя файла без расширения в 1 строку:
$path = "/etc/sudoers.php"; print array_shift(explode(".", basename($path))); // will print "sudoers" $file = "file_name.php"; print array_shift(explode(".", basename($file))); // will print "file_name"
существующие решения терпят неудачу, когда есть несколько частей к расширению. Функция ниже работает для нескольких частей, полный путь или просто имя файла:
function removeExt($path) { $basename = basename($path); return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0])); } echo removeExt('https://example.com/file.php'); // https://example.com/file echo removeExt('https://example.com/file.tar.gz'); // https://example.com/file echo removeExt('file.tar.gz'); // file echo removeExt('file'); // file
Comments