web-dev-qa-db-ja.com

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を返すようにしたい。

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

167
Mostafa Elkady

その必要はありません。 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
328
anon

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"

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

しかし、あなたの質問は拡張子ベースネ​​ームを取得する必要があることを示唆しているので、私は ペッカの答え として投票します最も便利なのは、単一のネイティブ関数を使用してパスとファイルについて必要な情報を提供するためです。

188
Gordon

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

pathinfo($path, PATHINFO_FILENAME);

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

56
yckart

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

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

これにより、最後の期間.から文字列の終わりまでが削除されます。

12
caiosm1005

拡張子がわからない場合は、このソリューションを使用してください

 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

11
anydasa

上記のほとんどすべてのソリューションには、変数$ pathからファイル名を取得する方法が示されています

以下のスニペットは現在の実行ファイル名を拡張子なしで取得

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

説明

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

7
Rohan Khude

@Gordon basenameは、拡張子を知っていれば問題なく機能します。

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

たくさんのコードを書く必要はありません。 1行のコードだけでも実行できます。 こちら をご覧ください

以下は、ファイル名のみを返し、拡張子名を削除する1行のコードです。

<?php
 echo pathinfo('logo.png')['filename'];
?>

印刷します

logo

ソース: 拡張子を削除し、PHPでファイル名のみを返す

私の場合、以下を使用します。私はその延長が何であるか気にしません。 :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.
4
Hoàng Vũ Tgtt

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

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

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

これを書くことができます

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

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

2
Jitendra Pawar

ショート

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

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

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

1
user2047861

使用している拡張機能がわからない場合は、これを試すことができます。

$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
Ghanshyam Gohel

あなたの答えは、PHPでファイル拡張子を隠すための完璧な解決策の下です。

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

拡張機能に複数のパーツがある場合、既存のソリューションは失敗します。以下の関数は、複数の部分、フルパスまたは単なるファイル名に対して機能します:

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
Dan Bray

これは、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"
0
Vincenzo Ruffa