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 без расширения.



файл-это просто строка в переменной.

685   17  

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"

PHP MAN function pathinfo

@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

короче

echo pathinfo(__FILE__)['filename']; // since php 5.2

имя файла без расширения файла, когда вы не знаете, что расширения:

$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

    Ничего не найдено.