設定ファイルをパースする

# parse_ini_file

(PHP 4, PHP 5, PHP 7, PHP 8)

parse_ini_file — 設定ファイルをパースする

### 説明

function parse_ini_file(string `$filename`, bool `$process_sections` = `false`, int `$scanner_mode` = `INI_SCANNER_NORMAL`): array|false

parse_ini_file() は、 `filename` で指定した ini ファイルをロードし、 連想配列としてその設定値を返します。

ini ファイルの構造は、php.ini の構造と同じです。

警告

この関数は、信頼できない入力に対して使用してはいけません。 ただし、`scanner_mode` が `INI_SCANNER_RAW` の場合を除きます。 パース済みの出力には、データベースパスワードを保持する定数など、 機密性の高い定数の値が含まれる可能性があるためです。

### パラメータ

`filename`

  パースしたい ini ファイルのファイル名。 相対パスが指定された場合、 現在のディレクトリから相対的な位置として評価され、 さらに include_path からファイルを探します。

`process_sections`

  `process_sections` パラメータに `true` を設定すると、セクション名と設定が含まれた多次元の配列を得ることができます。 デフォルトでは、`process_sections` は `false` です。

`scanner_mode`

  `INI_SCANNER_NORMAL` (デフォルト) あるいは `INI_SCANNER_RAW`。`INI_SCANNER_RAW` を指定すると、オプションの値はパースされません。

  PHP 5.6.1 以降では `INI_SCANNER_TYPED` も指定できるようになりました。 このモードでは、boolean や null そして integer の型を、可能な限り維持します。 文字列 `"true"`、`"on"` そして `"yes"` は `true` に変換されます。`"false"`、`"off"`、`"no"` そして `"none"` は `false` だとみなされます。このモードでは、`"null"` は `null` に変換されます。また数値形式の文字列も、可能な限り integer 型に変換されます。

### 戻り値

成功した場合に設定を連想配列形式で返します。 失敗した場合に `false` を返します。

### 例

例1 sample.ini の内容

    ; これは設定ファイルのサンプルです。
    ; php.ini と同様、';' で始まる行はコメントです。

    [first_section]
    one = 1
    five = 5
    animal = BIRD

    [second_section]
    path = "/usr/local/bin"
    URL = "http://www.example.com/~username"

    [third_section]
    phpversion[] = "5.0"
    phpversion[] = "5.1"
    phpversion[] = "5.2"
    phpversion[] = "5.3"

    urls[svn] = "http://svn.php.net"
    urls[git] = "http://git.php.net"

例2 parse_ini_file() の例

定数 (但し `__FILE__` のような "マジック定数" は除く) も ini ファイル上でパースされます。 そのため、parse_ini_file() をコールする前に ini ファイル上の値として定数を定義した場合、戻り値に統合されます。 ini ファイル上の値だけが評価されます。この値は定数でなければなりません。以下は例です：

    <?php

    define('BIRD', 'Dodo bird');

    // セクションを無視してパースします。
    $ini_array = parse_ini_file("sample.ini");
    print_r($ini_array);

    // セクションを意識してパースします。
    $ini_array = parse_ini_file("sample.ini", true);
    print_r($ini_array);

    ?>

上の例の出力は、 たとえば以下のようになります。

    Array
    (
        [one] => 1
        [five] => 5
        [animal] => Dodo bird
        [path] => /usr/local/bin
        [URL] => http://www.example.com/~username
        [phpversion] => Array
            (
                [0] => 5.0
                [1] => 5.1
                [2] => 5.2
                [3] => 5.3
            )

        [urls] => Array
            (
                [svn] => http://svn.php.net
                [git] => http://git.php.net
            )

    )
    Array
    (
        [first_section] => Array
            (
                [one] => 1
                [five] => 5
                [animal] => Dodo bird
            )

        [second_section] => Array
            (
                [path] => /usr/local/bin
                [URL] => http://www.example.com/~username
            )

        [third_section] => Array
            (
                [phpversion] => Array
                    (
                        [0] => 5.0
                        [1] => 5.1
                        [2] => 5.2
                        [3] => 5.3
                    )

                [urls] => Array
                    (
                        [svn] => http://svn.php.net
                        [git] => http://git.php.net
                    )

            )

    )

例3 parse_ini_file() による php.ini ファイルのパース

    <?php
    // 以下の結果を比較するための簡単な関数
    function yesno($expression)
    {
        return($expression ? 'Yes' : 'No');
    }

    // php.ini へのパスを the php_ini_loaded_file() 関数で取得します
    $ini_path = php_ini_loaded_file();

    // php.ini をパースします
    $ini = parse_ini_file($ini_path);

    // 結果を表示して比較します。get_cfg_var() を使用すると、
    // ここでパースして読み込んだのと同じ結果が得られることに注意しましょう
    echo '(parsed) magic_quotes_gpc = ' . yesno($ini['magic_quotes_gpc']) . PHP_EOL;
    echo '(loaded) magic_quotes_gpc = ' . yesno(get_cfg_var('magic_quotes_gpc')) . PHP_EOL;
    ?>

上の例の出力は、 たとえば以下のようになります。

    (parsed) magic_quotes_gpc = Yes
    (loaded) magic_quotes_gpc = Yes

例4 ini ファイルの値の補完

定数を評価することに加えて、文字によっては ini ファイルの値として特別な意味を持つものがあります。 さらに、環境変数や以前定義された設定オプション (get_cfg_var() も参照ください) は、 `${}` を使って読み取ることができます。

    ; | は ビット演算の OR
    is used for bitwise OR
    three = 2|3

    ; & は ビット演算の AND
    four = 6&5

    ; ^ は ビット演算の XOR
    five = 3^6

    ; ~ は ビット演算の NOT
    negative_two = ~1

    ; () はグループ化に使います
    seven = (8|7)&(6|5)

    ; 環境変数 PATH を展開します
    path = ${PATH}

    ; 設定オプション 'memory_limit' を展開します
    configured_memory_limit = ${memory_limit}

例5 文字をエスケープする

文字によっては、ダブルクォートで囲まれた文字列の中で特別な意味を持つ場合があり、 その場合、バックスラッシュでエスケープしなければなりません。 特別な意味を持つのは、文字列の境目の印となるダブルクォート `"`、 および、バックスラッシュ `\` (この文字の後に特別な文字がひとつ続きます) そのものです。

    quoted = "She said \"Exactly my point\"." ; Results in a string with quote marks in it.
    hint = "Use \\\" to escape double quote" ; Results in: Use \" to escape double quote

Windows ライクなパスについては例外があります。 クォートされた文字列のすぐ後に改行文字が続いた場合、 末尾のバックスラッシュはエスケープする必要がないというものです。

    save_path = "C:\Temp\"

複数行にまたがる値で、改行文字が直後にあるダブルクォート文字をエスケープする必要がある場合、 次のようにして値を連結することでそれを実現できます。 (ダブルクォートで囲まれた文字列がひとつあり、その直後にもうひとつの文字列が続きます)

    long_text = "Lorem \"ipsum\"""
     dolor" ; Results in: Lorem "ipsum"\n dolor

特別な意味を持つ別の文字として、`$` (ドル記号) があります。 これは、開き括弧が続く場合、エスケープしなければいけません:

    code = "\${test}"

文字のエスケープは、 `INI_SCANNER_RAW` モードではサポートされていません。 (このモードでは、全ての文字が "そのまま" 処理されます)

ini ファイルのパーサーは、標準的なエスケープシーケンス (`\n`, `\t`, など) をサポートしていないことに注意して下さい。 そのサポートが必要な場合、parse_ini_file() の処理結果を stripcslashes() で処理するようにして下さい。

### 注意

> 注意:

> この関数は、php.ini ファイルには何もしません。 このファイルはスクリプトを実行している時には既に処理されています。 この関数は、アプリケーション個有の設定ファイルを読み込む際に使用可能です。

> 注意:

> ini ファイル上の値に英数字ではないものがある場合、 ダブルクォート(")で囲う必要があります。

> 注意: ini ファイル上でキーとして使ってはいけない単語があります。 `null`, `yes`, `no`, `true`, `false`, `on`, `off`, `none` などです。 `null`, `off`, `no` および `false` は `""` となり、 `on`, `yes` および `true` は `"1"` となります。 ただし、`INI_SCANNER_TYPED` モードを使っている場合は別です。 次の文字 `?{}|&~!()^"` は、キーで使ってはいけません。 また、値の中で特別な意味を持ちます。

> 注意:

> 等号が含まれないエントリは無視されます。 つまり、"foo" というエントリは無視されますが、 "bar =" は、空の値を持つエントリとして追加されます。 たとえば MySQL の my.cnf には "no-auto-rehash" という設定項目がありますが、この項目には何も値を設定しません。 そのため、この項目は無視されます。

> 注意:

> ini ファイルは、一般的にWebサーバーからはプレーンテキストとして扱われます。 よって、ini ファイルにリクエストがあった場合、ブラウザにそのまま表示されます。 これは、セキュリティを考慮すると、 ini ファイルはドキュメントルートの外側に置くか、 Webサーバーがそれを返さないように設定を変更しなければならないということです。 そうしないと、セキュリティ上のリスクが発生する可能性があります。

### 参考

- parse_ini_string() - 設定文字列をパースする

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open