Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. basename() / dirname() / pathinfo() / glob()

basename() / dirname() / pathinfo() / glob()対応: PHP 4(2000)

ファイルパスからファイル名やディレクトリ名を取得したり、パス情報の分解やファイルの検索を行います。パスの解析とファイルシステムの走査に欠かせない関数群です。

構文
// パスからファイル名を取得します。
basename($path, $suffix);

// パスからディレクトリ部分を取得します。
dirname($path, $levels);

// パスをディレクトリ名・ファイル名・拡張子に分解します。
pathinfo($path, $flags);

// シンボリックリンクを解決した絶対パスを返します。
realpath($path);

// パターンに一致するファイルパスの配列を返します。
glob($pattern, $flags);

// ディレクトリ内のファイルとディレクトリの一覧を返します。
scandir($directory, $sorting_order);
関数一覧
関数概要
basename($path, $suffix)パスの末尾にあるファイル名を返します。第2引数に拡張子を指定するとその部分を除去して返します。
dirname($path, $levels)パスの親ディレクトリを返します。第2引数で何階層上かを指定できます。
pathinfo($path, $flags)パスを分解して、ディレクトリ名・ファイル名・拡張子を連想配列またはキー指定で返します。
realpath($path)相対パスやシンボリックリンクを解決して、正規化された絶対パスを返します。存在しないパスの場合は『false』を返します。
glob($pattern)シェルのワイルドカードに似たパターンでファイルを検索し、マッチしたパスの配列を返します。
scandir($directory)ディレクトリ内のすべてのファイルとディレクトリを配列として返します。『.』と『..』も含まれます。
戻り値

『basename()』と『dirname()』は文字列を返します。『pathinfo()』は第2引数を省略すると連想配列、指定すると文字列を返します。『realpath()』は成功時に文字列、失敗時に『false』を返します。『glob()』と『scandir()』は配列を返します。

サンプルコード
<?php
// basename() でファイル名を取得します。
echo basename("/var/www/html/images/photo.jpg"); // 『photo.jpg』と出力されます。

// 拡張子を除いたファイル名を取得します。
echo basename("/var/www/html/style.css", ".css"); // 『style』と出力されます。

// dirname() でディレクトリ部分を取得します。
echo dirname("/var/www/html/images/photo.jpg"); // 『/var/www/html/images』と出力されます。

// 2階層上のディレクトリを取得します。
echo dirname("/var/www/html/images/photo.jpg", 2); // 『/var/www/html』と出力されます。

// pathinfo() でパスを分解します。
$info = pathinfo("/var/www/html/images/photo.jpg");
echo $info["dirname"]; // 『/var/www/html/images』と出力されます。
echo $info["basename"]; // 『photo.jpg』と出力されます。
echo $info["extension"]; // 『jpg』と出力されます。
echo $info["filename"]; // 『photo』と出力されます。

// 特定の情報だけを取得します。
$ext = pathinfo("/var/www/html/report.pdf", PATHINFO_EXTENSION);
echo $ext; // 『pdf』と出力されます。

// realpath() で絶対パスに変換します。
echo realpath("./config/../data/users.json"); // 『/var/www/html/data/users.json』のように出力されます。

// 存在しないパスでは false が返されます。
var_dump(realpath("/not/exist/path")); // 『bool(false)』と出力されます。

// glob() でファイルを検索します。
$images = glob("/var/www/html/images/*.jpg");
foreach ($images as $file) {
    echo basename($file) . "\n"; // マッチしたJPGファイル名が出力されます。
}

// glob() で複数の拡張子を検索します。
$files = glob("/var/www/html/uploads/*.{jpg,png,gif}", GLOB_BRACE);
echo count($files) . "件の画像ファイルが見つかりました。";

// scandir() でディレクトリの一覧を取得します。
$entries = scandir("/var/www/html/");
foreach ($entries as $entry) {
    if ($entry === "." || $entry === "..") continue; // カレントと親を除外します。
    echo $entry . "\n"; // ファイルとディレクトリが出力されます。
}

// ディレクトリトラバーサル対策の実用例
$user_input = "../../etc/passwd";
$safe_name = basename($user_input); // 『passwd』だけが取り出されます。
$full_path = realpath("/var/www/html/uploads/" . $safe_name);
if ($full_path && strpos($full_path, "/var/www/html/uploads/") === 0) {
    echo "安全なパスです: " . $full_path;
} else {
    echo "不正なパスが指定されました。";
}
概要

パス操作関数はファイルシステムを扱うプログラムの基本です。『basename()』はディレクトリトラバーサル対策として、ユーザー入力からファイル名だけを安全に取り出す場面で重要な役割を果たします。

『glob()』はシェルのワイルドカードと同じ記法でファイルを検索でき、『*』は任意の文字列に、『?』は任意の1文字にマッチします。『GLOB_BRACE』フラグを使うと『*.{jpg,png}』のように複数パターンを一度に検索できます。『scandir()』はディレクトリの全件を返すのに対し、『glob()』はパターンにマッチするものだけを返すため、用途に応じて使い分けてください。

『realpath()』は存在しないパスに対して『false』を返すため、ファイルの存在確認も兼ねています。セキュリティ対策では、『realpath()』で正規化したパスが許可されたディレクトリ配下にあるかを『strpos()』で検証するパターンが定番です。ファイルの読み書きには『file_get_contents() / file_put_contents()』を使用してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。