プロが教える店舗&オフィスのセキュリティ対策術

parse_ini_fileで読取る設定ファイルでは、
ダブルクォートを含む値を用いることはできないのでしょうか。
ダブルクォートを含んだ値を記述したかったのですが、
設定ファイルのパースエラーになるか、途中で値が切れてしまいました。

以下を試しました。
(PHP 5.0.4 です。)
<テストコード>
<?php
print_r(parse_ini_file("test.ini"));
?>
<設定ファイル test.ini の内容>
(ダブルクォートを含む)
key=val"ue
--> 値がvalになる
(ダブルクォートをエスケープ)
key=val\"ue
-->値がval\になる
(全体をダブルクォートで囲んで中のダブルクォートをエスケープ)
key="val\"ue"
-->値がval\になる
(全体をダブルクォートで囲んで中のダブルクォートを二連化)
key="val""ue"
-->パースエラーが発生し、値がvalになる
(全体をシングルクォートで囲む)
key='val"ue'
-->値が'valになる

マニュアルで以下の文が気になったのですが・・。
( http://jp.php.net/manual/ja/function.parse-ini-f … )
----- 引用 ここから -----
次の文字 {}|&~![()" は、キーで使ってはいけません。 また、値の中で特別な意味を持ちます。
----- 引用 ここまで -----
ダブルクォートが「値の中で特別な意味」を持つ文字として
指定されていますが、具体的にどのような意味を持つのか分かりませんでした。
ですが、キーとしては禁止されているものの、値に含まれる文字としては禁止されていないようだったので・・。

どなたか詳しい情報ご存知の方いましたらご教授ください。

A 回答 (2件)

【parse_ini_file】検証してみました。



ダブルクォートは、『keyに文字列を入れる際に囲むもの』
としか認識しないようですね。
ダブルクォートを【値】として使いたい場合は、
違う文字(使用禁止文字以外で)でiniファイルに記述し
取り出したのち、置換したほうが無難のようです。
    • good
    • 0
この回答へのお礼

遅くなりまして申し訳ありません。
回答いただきありがとうございます。

> ダブルクォートは、『keyに文字列を入れる際に囲むもの』
> としか認識しないようですね。
やはりそうですか・・。
「値の中で特別な意味」とはそういうことなのですね。

> ダブルクォートを【値】として使いたい場合は、
> 違う文字(使用禁止文字以外で)でiniファイルに記述し
> 取り出したのち、置換したほうが無難のようです。
ありがとうございます。
その方向で検討してみたいと思います。

お礼日時:2008/01/02 16:04

User Notesのとこにもありますが、定数を使う方法も。


<?php
define('QUOTE', '"');
$test = parse_ini_file('test.ini');
------
key="val" QUOTE "ue"
------

詳しく調べてないですが、Linux-PHP5.1, Win-PHP5.1 で動作、
Linux-PHP5.0で動作しませんでした。

参考URL:http://jp.php.net/manual/ja/function.parse-ini-f …
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
遅くなりまして申し訳ありません。

> User Notesのとこにもありますが、定数を使う方法も。
ご指摘ありがとうございます。
すみません。User Notesにも情報があったのですね。
英語があまり得意でないもので読み流していました。。
確かに定数が評価されるので、
そのような手法が可能なのですね。

> Linux-PHP5.1, Win-PHP5.1 で動作、
> Linux-PHP5.0で動作しませんでした。
検証までしていただきありがとうございます。
私もLinux-PHP5.1とLinux-PHP5.0で確かめてみました。
確かにPHP5.0ではパースエラーが発生し、
PHP5.1だと期待通りの動作をしました。

PHP5.0でも定数が評価されないわけでは無いようなので、
パースルールが5.0から5.1で変更があったということなのでしょうか。

今回はPHP5.0でも動作させたいので、
KOHSHI様からお教えいただいた手法で検討してみたいと思います。
どうもありがとうございました。

お礼日時:2008/01/02 16:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!