[PHP]basename() はマルチバイトに対応できない?

Pocket

ファイルパスから末尾のファイル名だけを取り出してくれる basename() は便利ですが、
ファイル名が日本語の場合などは、文字の一部が文字化けてしまったり、消えてしまったりすることがあります。

その際 setlocale() により適切なロケールを設定すれば正しく動作するようになります。

setlocale(LC_CTYPE, 'ja_JP.UTF-8');
$path = 'テスト.txt';
echo basename($path);

ただし PHP のバージョンによっては正常に動作しないケースも有るようなので、代替として次のような関数を作ってみました。

<?php
$path = 'http://localhost/test/日本語.txt';
header("Content-type: text/html; charset=UTF-8");
echo mb_basename($path, ".txt");

function mb_basename($str, $suffix=null){
	$tmp = preg_split('/[\/\\\\]/', $str);
	$res = end($tmp);
	if(strlen($suffix)){
		$suffix = preg_quote($suffix);
		$res = preg_replace("/({$suffix})$/u", "", $res);
	}
	return $res;
}

区切り文字にはスラッシュ・バックスラッシュ(円マーク)が混在して使えます。
suffix にも対応させてあります。


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です