マルチバイト対応版pathinfo
ないらしい。バイトで使いたかったから書いた。とりあえずunix系のみ対応。
/**
* マルチバイト文字列対応pathinfo
*/
function mb_pathinfo()
{
$info = array(
'dirname' => '',
'filename' => '',
'basename' => '',
'extension' => '',
);
$num = func_num_args();
if ($num == 0) { return $info; }
$args = func_get_args();
// path
$path = array_shift($args);
// dir and base
while(1) {
$lastSlashPos = mb_strrpos($path, "/");
if ($lastSlashPos === FALSE) {
$info['basename'] = $path;
break;
}
else if ($lastSlashPos == 0){
$info['dirname'] = mb_substr($path, 0, 1);
$info['basename'] = mb_substr($path,1);
break;
}
else if ($lastSlashPos == (mb_strlen($path) - 1)){
$path = mb_substr($path,0, $lastSlashPos);
}
else {
$info['dirname'] = mb_substr($path, 0, $lastSlashPos);
$info['basename'] = mb_substr($path,$lastSlashPos + 1);
break;
}
}
// file and extension
$lastDotPos = mb_strrpos($info['basename'], ".");
if ($lastDotPos === FALSE) {
$info['filename'] = $info['basename'];
} else {
$info['filename'] = mb_substr($info['basename'],0, $lastDotPos);
$info['extension'] = mb_substr($info['basename'], $lastDotPos + 1);
}
// default
if ($num == 1) { return $info; }
// output
$result = array();
foreach($args as $value) {
switch($value) {
case PATHINFO_DIRNAME:
$result['dirname'] = $info['dirname'];
break;
case PATHINFO_BASENAME:
$result['basename'] = $info['basename'];
break;
case PATHINFO_EXTENSION:
$result['extension'] = $info['extension'];
break;
case PATHINFO_FILENAME:
$result['filename'] = $info['filename'];
break;
}
}
if (count($result) == 1) {
return array_shift($result);
} else {
return $result;
}
}