やりたいこと
今回やりたいことは、
- 日本語を含むファイル名の拡張子部分を切り取りたい
ということです。
注意点
注意点としては
- 日本語を含む場合は、マルチバイト対応のメソッド(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で指定した文字列の文字数を取得します。
PHP: mb_strlen – Manual
mb_substrで指定した文字列の部分文字列を取得します。
PHP: mb_substr – Manual
ちなみに、htmlentitiesはセキュリティ上の理由でつけてます。(詳細については参考サイト貼っていましたが、サイト終了していました)
コメント