指定した文字列（拡張子）から後の文字列を削除するPHPの小技

#はじめに
インターネットのダウンロードリンクに以下（１．）のようなファイルのリンクがあり、ファイルの拡張子から後の文字列を削除する事が必要になりました。色々とググったのですが具体的な方法が発見できませんでした。その後、自分流の不器用な方法で出来ましたのでメモを残します。このリンクからファイルを wget すると以下の（２．）のファイル名で保存されてしまいます。それを（３．）のファイル名で取れるようするのが目的です。この記事は別に書いた以下の「WEBファイルをPCへ落とさずにブラウザで読むには」の為の小技です。

[WEBファイルをPCへ落とさずにブラウザで読むには](https://qiita.com/XbaseFox/items/a2e7164376f7d89770ee)

１．実際のリンク（これは2019.11.19現在実在します）
http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf?productId=SJ-D23D&_ga=2.161349309.1818851682.1531209133-1752366186.1522914385

２．リンクをそのまま wget すると保存されるファイル名は以下になります。
「sjd23d_mn.pdf?productId=SJ-D23D」

３．これを以下のファイル名で保存したいのです。
「sjd23d_mn.pdf」

######文字列の変換処理で解決したい
wgetは他にも方法があるかと記憶してますが、ファイル名を単純に変更出来た方が処理上有り難いのです。

``` php

http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf?productId=SJ-D23D&_ga=2.161349309.1818851682.1531209133-1752366186.1522914385
// 上のリンクを wget すると 'sjd23d_mn.pdf?productId=SJ-D23D'
wget http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf?productId=SJ-D23D&_ga=2.161349309.1818851682.1531209133-1752366186.1522914385
// 実際は以下のようにしたい
wget http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf
```

######指定した文字列から切り取ります
実際に調べだすと文字列を含んで最後までというのは可能ですが、特定の文字列から後をばっさり切るのは単純には無理だと分かって来ましたので、まず「.pdf」を含んだその後の文字列を以下で切り取ります。

``` php

$string = "http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf?productId=SJ-D23D&_ga=2.161349309.1818851682.1531209133-1752366186.1522914385";

/* 指定した文字列を検索 */
$wdele = strstr($string, '.pdf')
var_dump( $wdele );

/* 以上を実行すると結果は以下のようになります。*/
.pdf?productId=SJ-D23D&_ga=2.161349309.1818851682.1531209133-1752366186.1522914385
```

######切り取った文字列を削除して必要な文字列を追加
次にこの文字列を削除します。削除した後に必要な文字列を追加します。

``` php
/* 次にこの文字列を削除します。 */
$string = str_replace($wdele, '', $string);
var_dump( $string );

/* 最後に必要な文字列を加えます。*/
$string = $string.".pdf";
var_dump( $string );

/* 以上の実行結果が以下となります。 */
http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn
http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf
```

######ファイルの拡張子を識別する preg_match() で少し悩む
preg_match() で拡張子を指定しながら特定の文字の処理で迷ったのでメモを残します。ファイルの拡張子（.pdf .doc .docx .xls .xlsx .ppt .pptx）によってここまでのコードは記述を変更する必要があります。

最初の文字列には途中に/doc/というディレクトリ名が含まれますので、実際の拡張子は .pdf ですが以下のコードでは doc がヒットしてしまいます。

```php

$string = "http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf?productId=SJ-D23D&_ga=2.161349309.1818851682.1531209133-1752366186.1522914385";
if (preg_match('/doc/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}
if (preg_match('/.doc/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}
if (preg_match('/pdf/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}
if (preg_match('/.pdf/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}

/* これを実行すると同じ結果が続きます。 */
ヒット
ヒット
ヒット
ヒット
```

######特殊文字の識別はバックスラッシュ（エスケープ）
以下のようにバックスラッシュをドット（特殊文字）の前に入れます。これで解決です。ドットはそのまま使うと**全ての文字にヒットしてしまいますので、バックスラッシュ（エスケープ）で特殊文字である事を宣言**する必要があります。

```php

$string = "http://www.sharp.co.jp/support/refrigerator/doc/sjd23d_mn.pdf?productId=SJ-D23D&_ga=2.161349309.1818851682.1531209133-1752366186.1522914385";
if (preg_match('/doc/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}
if (preg_match('/\.doc/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}
if (preg_match('/pdf/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}
if (preg_match('/\.pdf/',$string)){var_dump( "ヒット" );}else{var_dump( "エラー" );}

/* これを実行すると正確に機能しました。 */
ヒット
エラー
ヒット
ヒット
```
######このように実装
実際にファイルの拡張子で分けるコードが以下になります。まあ、おまけです。

``` php

if(preg_match('/\.docx/',$string)){
	$wdele = strstr($string, '.docx');
	$string = str_replace($wdele, '', $string).".docx";
}else if(preg_match('/\.doc/',$string)){
	$wdele = strstr($string, '.doc');
	$string = str_replace($wdele, '', $string).".doc";
}else if(preg_match('/\.xlsx/',$string)){
	$wdele = strstr($string, '.xlsx');
	$string = str_replace($wdele, '', $string).".xlsx";
}else if(preg_match('/\.xls/',$string)){
	$wdele = strstr($string, '.xls');
	$string = str_replace($wdele, '', $string).".xls";
}else if(preg_match('/\.pptx/',$string)){
	$wdele = strstr($string, '.pptx');
	$string = str_replace($wdele, '', $string).".pptx";
}else if(preg_match('/\.ppt/',$string)){
	$wdele = strstr($string, '.ppt');
	$string = str_replace($wdele, '', $string).".ppt";
}else if(preg_match('/\.pdf/',$string)){
	$wdele = strstr($string, '.pdf');
	$string = str_replace($wdele, '', $string).".pdf";
}
```

ググっていると高度なテクニックか、物凄く初歩的なテクニックが多くて実用的なテクニックは少ないので、気付いた事は今後も恥ずかしがらずにアップしようと思います。私はプログラムの作り方を習った事も無く、バックスラッシュで特殊文字が識別されるとかは実践で理解して進んでいますので、学生時代や入った会社で勉強出来た人が正直言って羨ましいのです。馬鹿な事を次々に書きそうですが、お許しください。こういう暴露話を書く場所ってあるのかな？