文字列から拡張子を削除する方法(実際の拡張子のみ!)


135

ファイル名から拡張子を削除できる小さな関数を探しています。

グーグルで多くの例を見つけましたが、「。」で文字列の一部を削除するだけなので、悪い例です。。彼らはリミッターにドットを使用し、文字列をカットします。

これらのスクリプトを見て、

$from = preg_replace('/\.[^.]+$/','',$from);

または

 $from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));

次のような文字列を追加すると、

this.is somestringの例

「これ」だけ返します...

拡張子は3文字または4文字にすることができるため、ドットが4または5の位置にあるかどうかを確認してから削除する必要があります。

どうすればできますか?


1
「本当の」拡張とは何ですか?ドットが前に付いている場合、最後の4文字またはles文字を削除しますか?
clyfe 2010年

「Col. Shrapnel」-Windowsユーザー向けに設計されています。"clyfe"-はい、ドットの後のすべてを削除しますが、それが4または5の位置にある場合のみ、 "。jpeg"または ".mp3"を表します。削除したくありません。str-posを使用して手動で行うことができ、ifステートメントを使用して文字列をカットできることを知っています(5 pos =ドットの場合は右5文字からカット(rtrim)、4 pos =ドットの場合はrtrim 4、それ以外の場合は変更せずに戻ります。しかし、多分それはより速い解決策です
marc

3
.packageファイルはどうですか?または.unity?拡張子を4文字に制限するのは少し任意のようです。
rdb

回答:


172

これを試してください:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);

したがって、これは、ドットまたはスペースではない3つまたは4つの文字が続くドットに一致します。短いまたは長いファイル拡張子がたくさんあるため、「3または4」のルールはおそらく緩和されるはずです。


:問題は次のようにファイル名を変更する人もあるということです20120720.something.somethingelse.jpg
Obmerk Kronenのは

3
これは、拡張子が2文字のファイルでは機能しないと思います
NaturalBornCamper

1
ty!変数の置換を行わない場合は、一重引用符を使用する必要があることに注意してください。例"$var"
aelgoa '29

まあ、それを.pyファイルで使用するには、3,4ではなく2,3,4を追加する必要があると思います:>ありがとう!
voghDev 2014年

2
@voghDev {2,4}では、代わりに追加する必要がある2〜4文字の拡張機能をサポートします{3,4}
Timo Huovinen


81

マニュアルから、pathinfo

<?php
    $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"; // Since PHP 5.2.0
?>

正しく動作するための完全なパスである必要はありません。それはと同じように楽しく解析さfile.jpg/path/to/my/file.jpgます。


私はすでにこれをチェックしました。上記と同じ間違い。T.sec-"xxx"から "$ path_parts ['filename']"にアクセスしてみてください。
マーク


35

これはかなり簡単な解決策であり、文字列内にある拡張子の長さやドットや他の文字の数に関係なく機能します。

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

基本的に、これは最後に出現するを探します。次に部分文字列を使用して、その時点までのすべての文字を取得します。

それはあなたのグーグルの例の1つに似ていますが、正規表現や他の例よりも単純で高速で簡単です。とにかくいも。それが誰かを助けることを願っています。


2
これは遅すぎることを知っていますが、これが最良の答えだと思います。よく働く。
Agbogidiマイケル2017

これは、例えば拡張子なし* nixの隠されたファイルに対して動作しません.htaccess
Fr0zenFyr

12

PHPに組み込まれているものを使用して支援できます...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);

ただし、ファイル名(.somefile.jpg)のみを処理している場合は、...

./somefile

CodePad.orgでご覧ください

または正規表現を使用して...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);

CodePad.orgでご覧ください

パスがなく、ファイル名だけの場合、これは機能し、より簡潔になります...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

CodePad.orgでご覧ください

もちろん、これらはどちらも最後の期間(.)を探すだけです。


ソリューションの最後の行で述べたように、次のようなファイル名では失敗します.htaccess
Fr0zenFyr

8

次のコードは私にとってはうまく機能し、それはかなり短いです。ファイルをドットで区切られた配列に分割し、最後の要素(仮想的には拡張子)を削除し、ドットで配列を再構成します。

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);

ファイルに拡張子がない場合はfalseを返し、ファイルがある場合は空を返します.htaccess
Timo Huovinen '19 / 06/19

5

Googleで多くの例を見つけましたが、 "。"で文字列の一部を削除するだけなので、問題があります。

実際には、それが絶対に正しいことです。さあ、それを使ってください。

ファイル拡張子は最後のドットより後のすべてであり、ファイル拡張子が特定の文字数である必要はありません。Windowsのことだけを話していても、たとえば3〜4文字に収まらないファイル拡張子が付いています。.manifest


2
.. .htaccessそして.htpasswd、apache環境では忘れないようにしましょう。
h2ooooooo 2013年

5

推奨使用: pathinfo あり PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);

4

それを行うにはいくつかの方法がありますが、私はより速い方法の1つは次のとおりだと思います

// $filename has the file name you have under the picture
$temp = explode( '.', $filename );
$ext = array_pop( $temp );
$name = implode( '.', $temp );

別の解決策はこれです。私はそれをテストしていませんが、ファイル名で複数の期間動作するはずです

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

また:

$info = pathinfo( $filename );
$name = $info['filename'];
$ext  = $info['extension'];

// Or in PHP 5.4, i believe this should work
$name = pathinfo( $filename )[ 'filename' ];

これらすべてに$name、拡張子なしのファイル名が含まれています


4
$image_name = "this-is.file.name.jpg";
$last_dot_index = strrpos($image_name, ".");
$without_extention = substr($image_name, 0, $last_dot_index);

出力:

this-is.file.name

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);これを追加して、ファイルの拡張子を取得します。
I_ATE_YOUR_WORK_FILES 2018年

2

他の人が言うように、拡張子を特定の文字数に制限するという考えは無効です。array_popのアイデアに沿って、区切り文字列を配列と考えて、この関数は私に役立ちました...

function string_pop($string, $delimiter){
    $a = explode($delimiter, $string);
    array_pop($a);
    return implode($delimiter, $a);
}

使用法:

$filename = "pic.of.my.house.jpeg";
$name = string_pop($filename, '.');
echo $name;

出力:

pic.of.my.house  (note it leaves valid, non-extension "." characters alone)

実行中:

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0


1

{x,y}演算子を使用して、正規表現パターンの長さを設定できます。{3,4}先行するパターンが3回または4回発生する場合に一致します。

しかし、私はあなたが本当にそれを必要としているとは思いません。「This.is」という名前のファイルをどうしますか?


0

これを使って:

strstr('filename.ext','.',true);
//result filename

これは、ファイル名にピリオドがまだない場合にのみ機能します。PHPドキュメントでは、針の最初の発生について言及しています
2014年

0

これを使ってみてください。それは確かにファイル拡張子を削除します。

$filename = "image.jpg";
$e = explode(".", $filename);
foreach($e as $key=>$d)
{
if($d!=end($e)
{

$new_d[]=$d; 
}

 }
 echo implode("-",$new_t);  // result would be just the 'image'

array_pop()でこれを1行に減らすことができます
Peter Brand

0

編集:最も賢いアプローチIMHO、それは最後のポイントとそれに続くテキストをファイル名(別名拡張子)から削除します:

$name = basename($filename, '.' . end(explode('.', $filename)));

乾杯;)


動作する可能性end()はありますが、パラメータとして渡される関数で動作することは想定されていません。また、通知が生成されます
CodeBrauer 2018

0

これは、拡張に複数の部分があり、短くて効率的である場合に機能します。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.