PHP, 파일 확장자없이 파일 이름 얻기


205

이 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. 확장없이 함수가 반환되기를 원합니다 .

파일은 변수의 문자열 일뿐입니다.


답변:


397

그럴 필요가 없습니다. 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

3
이것이 왜 하향 조정 되었습니까? 답은 완전히 맞습니다. pathinfo는 문자열에서 작동하므로 파일이 실제로 서버에 있는지 여부는 중요하지 않습니다.
고든

13
불행히도 "basename"이라는 이름은 기본 이름이 아니라 확장자를 가진 전체 파일 이름을 반환하기 때문에 잘못되었습니다.
Oscar

1
@Oscar는 가장 널리 이해되는 용어 basename입니다. 오명 없음.
nawfal

1
이것은 특히 파일 확장자를 알기 위해 파일 확장자를 알 필요가 없을 때 매우 유용합니다.
Vahid Amiri

이것은 매우 우아한 솔루션입니다. 명성. 정답으로 표시해야합니다.
Native Coder

199

에 대한 대안으로 pathinfo(), 당신이 사용할 수있는

  • basename() — 경로의 파일 이름 구성 요소를 반환

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"

확장 프로그램을 미리 제거하려면 확장 프로그램을 알고 있어야합니다.

그러나 귀하의 질문에 따라 확장명 기본 이름을 가져와야 한다고 제안 했기 때문에 Pekka의 답변 을 가장 유용한 답변 으로 표명 했습니다. 함수.


1
내가 파일 확장자에 대해 모른다면 어떻게 .. 경로가 동적인지 말하십시오 파일 확장자의 모든 유형이 들어올 수 있습니다! 그리고 뭐 ??
user889030

@ user889030 다음은 OP는 다른 시나리오를 가지고 있으며 사용하지 않는 basename,하지만 pathinfo같은 페이지에 elsewere 표시.
Gordon

72

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);

간단한 기능 테스트 : https://ideone.com/POhIDC


이것은 확장자를 가진 파일 이름 반환합니다.
user966939

2
@ user966939 MHH, 아니 확장입니다 basename;-)
yckart

어느 쪽이든, 그는 확장없이 솔루션을 요구했습니다. ;)
user966939

2
@ user966939, Dude 전혀 확장이 없습니다. 그건 PATHINFO_FILENAME하지 PATHINFO_EXTENSION ...
Pacerier

20
filename확장 기능이 없다고 결정한 사람은 basename가학 적 경향이 있어야합니다 ...
Mark

12

또 다른 방법은 정규식을 사용하는 것입니다.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

마지막 .문자열부터 문자열 끝까지 제거 합니다.


나는이 대답을 매우 간단하고 확장명을 모른다면 작동합니다.
15:08에

explode를 사용하는 것보다 훨씬 낫고 파일 이름에 마침표를 사용한 경우 마지막 마침표 섹션 만 잡습니다
Kiwizoom

7
아니 , 훨씬 더 나빠. 정규식을 중지하십시오.
Pacerier

고마워, 그리고 위의 의견은 그것을 못 박았다. 확장명을 알 필요가 없어서 이것이 더 유용합니다.
James Taylor

1
@ caiosm1005, 정규 표현식 엔진의 내부에 대해 추론하기 어렵 기 때문에 공격 표면이 즉시 증가합니다. 예를 들어, 위의 코드 $fileName에서 엔진이 지수 (또는 더 나쁜) 시간에 실행될 수있는 입력 이 있으면 이상하지 않습니다 . 그리고 우리 가이 특정 정규식 엔진의 내부를 해부하고 이론적으로 그것이 가능한 모든 가치에 대해 강력하다는 것을 증명했다고 가정하면 $fileName, 코드는 여전히 정규식 엔진의 다른 구현을 가진 다른 플랫폼으로 임의로 이식 할 수 없습니다.
Pacerier

12

확장명이 알려지지 않은 경우이 솔루션을 사용하십시오.

 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 함수 경로 정보


에 대한 PHP 매뉴얼 페이지와 비슷한 내용을 입력하십시오 pathinfo. 이것은 OP가 ShowFileExtension방법을 개선 하는 데 도움 이 되며이 답변을 찾으려고하는 모든 사람에게 추가 독서를 제공 할 것입니다. 또한 약간의 설명은 길을
잃지

1
나는 ~ 2 년 전에 같은 해결책 으로이 질문에 이미 대답했습니다.;)
yckart

@yckart true이지만 이것은 답변 내에 여러 가지 예를 제공합니다. 귀하는 ideone.com에 연결하는 이점이 있지만 사이트가 오프라인 상태가 될 수 있습니다.
Adam Elsodaney

7

@Gordon 기본 이름은 확장 기능을 알고 있으면 explode를 사용할 수 없다면 잘 작동합니다.

$filename = end(explode(".", $file));

1
답변 아래에 설명 기능이있는 의견을 보내주십시오. 이것에 가장 적합한 기능 pathinfo은입니다. 그래서 basename대안으로 만 주었습니다 . pathinfo정규식 또는 로 다시 발명 할 필요가 없습니다 explode.
Gordon

4
@fire, 업데이트가 의미가 없습니다. end(explode(".", $file));파일 이름이 아닌 확장자를 제공합니다.
Pacerier

7

위의 거의 모든 솔루션에는 변수 $ path에서 파일 이름을 가져 오는 것으로 표시됩니다.

아래 스 니펫은 확장자없이 현재 실행중인 파일 이름을 얻습니다.

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

설명

$ _SERVER [ 'SCRIPT_NAME']에는 현재 스크립트의 경로가 포함되어 있습니다.



4

@fire 파일 이름에 점이 사용 된 경우 잘못된 출력을 얻을 수 있습니다. @Gordon 메서드를 사용하지만 확장명도 얻으므로 기본 이름 함수는 다음과 같이 모든 확장명과 함께 작동합니다.

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"

4

내 경우에는 아래를 사용합니다. 나는 그 확장이 무엇인지 상관하지 않습니다. : D 나는 그것이 당신을 도울 것이라고 생각합니다

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.

Btw .: 오타가 있음$extenion
Thomas Kekeisen

2

당신은 이것을 쓸 수 있습니다

$filename = current(explode(".", $file));

이전에 사용하지 않은 경우 배열의 현재 요소를 반환합니다.


안녕하세요, Pleas e는 다운 그레이드하기 전에 확인합니다. 코드에서 여러 번 사용 했으므로 작동합니다. 이 기능을 사용하면 파일 이름이 "xyz.jpg"인 경우 파일 이름 만 얻을 수 있습니다. 전체 경로가 포함 된 파일 이름에는 작동하지 않을 수 있습니다.
Jitendra Pawar

파일 이름에 점이 여러 개있는 경우에도 제대로 작동하지 않습니다 (예 : "some.interesting.image.jpg"
ganzpopp

2

짧은

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

좋은. 내가 코드 위에 넣을하지만 b.php나는 실행 a.php필요 require('b.php'). 그런 다음 출력은 어떻게 것 b대신에a
로한 Khude

1

해당 확장자를 모르는 경우 파일 확장자가없는 파일 이름 :

$basename = substr($filename, 0, strrpos($filename, "."));


2
확장명이 .tar.gz와 같은 경우는 어떻습니까?
Arda

1

가지고있는 확장명을 모르는 경우 다음을 시도해보십시오.

$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"

1

귀하의 답변은 PHP에서 파일 확장자로 숨길 수있는 완벽한 솔루션입니다.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>

1

확장에 여러 부품이 있으면 기존 솔루션이 실패합니다. 아래 함수는 여러 부분, 전체 경로 또는 파일 이름에 사용할 수 있습니다.

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

0

이것은 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.