拡張(縮小?)parse_ini_file()関数

/**
 * parse_ini_file extension
 *
 * @param string $file
 * @return string[]|false
 * @access public
 */
function parse_ini_file_ex($file){
    if (!$lines = file($file, 1))
        return false;

    $res  = array();
    $curr = & $res;

    $sectionPattern = '/^\[([^\]]+)\]/';
    $linePattern   = '/^\s*([^=\s]*)\s*=\s*"?(.*?)"?\s*(?:;.*)?$/';

    foreach ($lines as $line){
        if (preg_match($sectionPattern, $line, $m)){
            // セクションの判断
            $res[$m[1]] = array();
            $curr = & $res[$m[1]];

        }elseif(preg_match($linePattern, $line, $m)){
            // キーと値をまとめて解析
            $curr[$m[1]] = $m[2];
        }
    }

    return $res;
}
  • trueや定数を判断しない(以前noの文字列が取れなくてハマったことがあったので・・
  • 英数字以外でもダブルクォーテーションで囲む必要は特にない(互換性のため、あっても構わない
  • key = "value1;value2" ; comment とすると ;value2" ; comment がコメントとしてスルーされる(値はvalue1


正規表現の部分を使いやすいように適当に変更するといいかも。
ぱっぱと書いたのでバグがあるかもしれないが・・それはその都度対応で。