新サイトへ移転しました
約3秒後に自動的にリダイレクトします。
やりたいこと
今回やりたいことは、
- 日本語を含むファイル名の拡張子部分を切り取りたい
ということです。
注意点
注意点としては
- 日本語を含む場合は、マルチバイト対応のメソッド(mb_***)を使おう
ということです。
当たり前のことかもしれないですが、今後繰り返さないようにメモしておきます。
改善前
以下の例では、例えば「hogehoge.txt」というファイル名は「hogehoge」となりますが、「ほげほげ.txt」は「ほげほげ.txt」のままでした。
<?php $image_name = "" . htmlentities(mb_substr($_FILES["file"]["name"], 0, strlen($_FILES["file"]["name"])-4), ENT_QUOTES, 'UTF-8'); ?>
文字列切り取りを行うときはmb_substrを使っていたのに、文字数を数えるときにマルチバイトに対応していないstrlenを利用していたのがうまくいかない理由でした。
改善後
上の例のstrlenをmb_strlenに修正するとうまくいきます。
<?php $image_name = "" . htmlentities(mb_substr($_FILES["file"]["name"], 0, mb_strlen($_FILES["file"]["name"])-4), ENT_QUOTES, 'UTF-8'); ?>
簡単な説明
mb_strlenで文字数を取得して、最初の文字~最後から4番目の文字までをmb_substrで切り出す、という感じです。
mb_strlenで指定した文字列の文字数を取得します。
http://php.net/manual/ja/function.mb-strlen.php
mb_substrで指定した文字列の部分文字列を取得します。
PHP: mb_substr - Manual
ちなみに、htmlentitiesはセキュリティ上の理由でつけてます。htmlentitiesについては以下のサイトがわかりやすかったです。
http://www.phppro.jp/phptips/archives/vol4/3