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、拡張子なしで関数が返って欲しいです。

ファイルは、変数内の単なる文字列です。


回答:


398

そのすべての必要はありません。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
ベース名ではなく拡張子付きの完全なファイル名を返すため、「ベース名」の名前を間違えたのは残念です。
オスカー

1
@オスカーそれは最も広く理解されている用語の意味ですbasename。名前の間違いはありません。
nawfal

1
これは特に、ファイル拡張子を抽出するためにファイル拡張子を知る必要がない場合に非常に役立ちます。
Vahid Amiri、

これは非常にエレガントなソリューションです。称賛。これは正解としてマークする必要があります。
Native Coder 2017年

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"

ただし、事前にそれを削除するには、拡張機能を知っている必要があります。

ただし、あなたの質問はあなたが拡張機能を入手する必要があることを示唆しているので ベース名ので、1つのネイティブのパスとファイルについて必要な情報が得られるため、ペッカの回答を最も有用なものとして投票します関数。


1
私がファイル拡張子について知らない場合はどうなりますか。じゃあ何 ??
user889030 2016

@ user889030次に、OPとは異なるシナリオがあり、を使用しませんbasenamepathinfo、ページに示されているとおりです。
ゴードン

72

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

pathinfo($path, PATHINFO_FILENAME);

簡単な機能テスト:https : //ideone.com/POhIDC


これは、ファイル名を返す拡張
user966939

2
@ user966939 MHH、ない拡張したものですbasename;-)
yckart

まあ、どちらにせよ、彼は拡張なしの解決策を求めていました。;)
user966939 2014

2
@ user966939、おい、拡張機能はまったくありません。それはPATHINFO_FILENAME、ではなくPATHINFO_EXTENSION ....
Pacerier

20
filename拡張子basenameはないがサディスティックな傾向があるはずだと決めた人は誰でも
マーク

12

別のアプローチは、正規表現を使用することです。

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

これにより、最後のピリオドから.ストリングの終わりまでが削除されます。


私はこの答えが好きです。非常にシンプルで、拡張機能がわからないときに機能します。
2014年


7
いいえ、それははるかに悪いです。人の正規表現を停止します。
Pacerier 2015

おかげで、上記のコメントはそれを釘付けにしました。拡張機能を知る必要がないため、これはより便利になります。
James Taylor

1
@ caiosm1005、正規表現エンジンの内部構造に反論するのが難しいため、攻撃面がすぐに増加します。たとえば、上記のコード$fileNameでは、エンジンが指数関数的(またはより悪い)時間で実行される原因となる可能性のある入力があったとしても、奇妙ではありません。そして、この特定の正規表現エンジンの内部の分析を完了し、可能なすべての値に対して堅牢であることが理論的に証明されていると仮定しても$fileName、コードは、正規表現エンジンの別の実装を持つ別のプラットフォームに勝手に移植できません。
Pacerier、2015

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関数pathinfo


のphp manページに「いいね!」を提供してくださいpathinfo。これは、OPがShowFileExtensionメソッドを改善するのに役立ち、この答えを見つけようとする人に追加の読みを提供します。また、説明の一部が誤って表示されない...
Michael Coxon

1
私は同じ解決策ですでにこの質問に回答しました。あなたの問題の2年前まで;)
yckart

@yckart trueですが、これは回答内に複数の例を示します。あなたにはideone.comにリンクするという利点がありますが、サイトがオフラインになる可能性があります。
アダムElsodaney

7

@Gordon basenameは、拡張機能がわかっている場合は正常に機能しますが、拡張機能を使用できない場合は、explodeを使用できます。

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

1
私の回答の下にあるコメント機能でコメントを私に送ってください。これに最も適切な関数はですpathinfo。そのため、私はbasename代替手段としてのみ提供しました。pathinfo正規表現やで再発明する必要はありませんexplode
Gordon

4
@fire、更新は意味がありません。end(explode(".", $file));ファイル名ではなく拡張子を指定します。
Pacerier 2015年

7

上記のほとんどすべての解決策は、変数$ pathからファイル名を取得することを示しています。

以下のスニペットは、現在実行されているファイル名を拡張子なしで取得します

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

説明

$ _SERVER ['SCRIPT_NAME']には、現在のスクリプトのパスが含まれています。



4

ファイル名にドットが使用されている場合、@ fireを使用すると、誤った出力が得られる可能性があります。@Gordonメソッドを使用しますが、拡張子も取得するため、basename関数は次のようにすべての拡張子で機能します。

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

ところで:入力ミスがあります$extenion
Thomas Kekeisen '15

2

あなたはこれを書くことができます

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

これらは、以前に使用されていない場合、配列の現在の要素を返します。


こんにちは、それをダウングレードする前にプレア電子チェック。それは私のコードで何度も使用したことがあり、機能しています。この関数を使用すると、ファイル名が「xyz.jpg」の場合、ファイル名だけを取得できます。パス全体を含むファイル名では機能しない場合があります。
Jitendra Pawar

これは、ファイル名に複数のドットが含まれている場合にも正しく機能しません。たとえば、「some.interesting.image.jpg」
ganzpopp

2

ショート

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

良い。しかし、上記のコードを入れてb.php実行a.phprequire('b.php')た場合、次に、出力はどのようにb代わりにa
Rohan Khude 2017年

1

その拡張子がわからない場合のファイル拡張子のないファイル名:

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


2
拡張子が.tar.gzのような場合はどうでしょうか?
アルダ

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.