[PHP]basename

PHP: basename - Manual パス中のファイル名の部分を返す。

string basename ( string $path [, string $suffix ] )

とりあえず

<?php

function p( $path, $suffix = null ){
  echo basename( $path, $suffix ) . '\r\n' ;
}

$path = "/dir/dir/name.htm";

p( $path )         ;
p( $path, ".htm" ) ;
p( $path, ".html") ;
p( $path, ".php" ) ;

?>

結果

name.htm
name
name.htm
name.htm

suffixが一致しない場合はsuffixの部分は無視されるのね

いろいろゴミをつけてみる

<?php

function p( $path, $suffix = null ){
  echo basename( $path, $suffix ) . "\r\n" ;
}

p( "http://fernweh.jp" ) ;
p( "http://fernweh.jp/" ) ;
p( "http://fernweh.jp/dir/" ) ;
p( "http://fernweh.jp/nosuffix" ) ;
p( "000?abc=123" ) ;
p( "/001?abc=123" ) ;
p( "/002.php?abc=123" ) ;
p( "/003.php#000" ) ;
p( "/004.php?abc=123#000" ) ;
p( "/005.php?abc=123#000", ".php" ) ;
p( "/006.php?abc=123#000", ".php?abc=123#000" ) ;
p( "/007.php?abc=123#000", "?abc=123#000" ) ;

?>

結果

fernweh.jp
fernweh.jp
dir
nosuffix
000?abc=123
001?abc=123
002.php?abc=123
003.php#000
004.php?abc=123#000
005.php?abc=123#000
006
007.php

スラッシュの位置とか適当でもよし

parse_urlと合わせる

ああ、そうかparse_urlと組み合わせるといいのか。

<?php

$url = "/dir/path?arg=value#anchor" ;
print_r( parse_url( $url ) ) ;

$path = parse_url( $url, PHP_URL_PATH ) ;
echo $path . "\r\n" ;

echo basename( $path ) ;

?>

結果

Array
(
    [path] => /dir/path
    [query] => arg=value
    [fragment] => anchor
)
/dir/path
path

これならスッキリ取り出せる

メモ

<?php
echo "dir separator : " . DIRECTORY_SEPARATOR . "\n" ;
echo "path separator : " . PATH_SEPARATOR . "\n" ;
echo "php_os : " . PHP_OS . "\n\n" ;

$path = "/hoge/dir/filename.text" ;
var_dump( pathinfo( $path ) );

echo "\n" ;
echo basename(
  pathinfo( $path, PATHINFO_BASENAME ) ,
  pathinfo( $path, PATHINFO_EXTENSION )
  // extention は拡張子という意味
  // じゃなかった。綴りが違う。exten"S"ion !
) . "\n\n" ;

//php 5.2.0 で PATHINFO_FILENAME が追加
echo pathinfo( $path, PATHINFO_FILENAME ) ;

?>

結果

dir separator : /
path separator : :
php_os : Linux

array(3) {
  ["dirname"]=>
  string(9) "/hoge/dir"
  ["basename"]=>
  string(13) "filename.text"
  ["extension"]=>
  string(4) "text"
}

filename.

filename

10行目の処理がちょっとダメだね。コンマが残ってるし。。

Share
関連記事