【问题标题】:Good PHP classes that manipulate .ini files操作 .ini 文件的优秀 PHP 类
【发布时间】:2012-03-24 13:17:02
【问题描述】:

我需要能够编辑 .ini 文件(我正在使用 parse_ini_file 读取),但要保留 cmets 和格式(换行符、缩进)。

你知道有什么好的类对这类东西有很好的优化功能吗?

【问题讨论】:

  • 你有一些样本输入和输出吗?
  • 它看起来像一个标准的 ini 文件,如 php.ini,有 4-5 个部分,其中包含一些 key = value 条目
  • 怀疑这样的事情同时存在(对于 PHP)。我会有一个editconfigini.php,但这会忽略部分,只关心受约束的键=值格式。
  • @mario - 确实存在这样做的东西。例如,Symfony 使用 ini 文件。
  • @Flukey - 出于兴趣,您想到了哪个版本的 Symfony?版本 1.x 主要将 ini 文件用于 Propel(db 配置在 propel.ini 中),但这只是一个配置读取器,而不是写入器 afaik。我想它会为此使用 Phing - 尽管其中可能有一个作家!

标签: php parsing ini


【解决方案1】:
【解决方案2】:

我没有在 Zend 组件框架中使用过config writer,但是我使用了配置阅读器,它非常可靠。肯定值得一试。

【讨论】:

  • 我试过了,真的很酷,但是作者不会保留cmets,它只会生成一个新的ini结构:(
  • 如果这是唯一的问题,您也许可以破解该功能?当然,如果这样的更改能够回到开源版本,那就太好了——如果这样你就可以利用他们的升级——但我想这取决于 Zend 关于特性/api 稳定性的政策。跨度>
  • 或者,您可以使用自己的类继承 Zend writer 类,包含注释更改。
【解决方案3】:

您可以尝试从这里开始,它会读取 ini 文件,并在写入时保留设置,您必须对其进行扩展以支持添加新条目:

class ini {
    protected $lines;

    public function read($file) {
        $this->lines = array();

        $section = '';

        foreach(file($file) as $line) {
            // comment or whitespace
            if(preg_match('/^\s*(;.*)?$/', $line)) {
                $this->lines[] = array('type' => 'comment', 'data' => $line);
            // section
            } elseif(preg_match('/\[(.*)\]/', $line, $match)) {
                $section = $match[1];
                $this->lines[] = array('type' => 'section', 'data' => $line, 'section' => $section);
            // entry
            } elseif(preg_match('/^\s*(.*?)\s*=\s*(.*?)\s*$/', $line, $match)) {
                $this->lines[] = array('type' => 'entry', 'data' => $line, 'section' => $section, 'key' => $match[1], 'value' => $match[2]);
            }
        }
    }

    public function get($section, $key) {
        foreach($this->lines as $line) {
            if($line['type'] != 'entry') continue;
            if($line['section'] != $section) continue;
            if($line['key'] != $key) continue;
            return $line['value'];
        }

        throw new Exception('Missing Section or Key');
    }

    public function set($section, $key, $value) {
        foreach($this->lines as &$line) {
            if($line['type'] != 'entry') continue;
            if($line['section'] != $section) continue;
            if($line['key'] != $key) continue;
            $line['value'] = $value;
            $line['data'] = $key . " = " . $value . "\r\n";
            return;
        }

        throw new Exception('Missing Section or Key');
    }

    public function write($file) {
        $fp = fopen($file, 'w');

        foreach($this->lines as $line) {
            fwrite($fp, $line['data']);
        }

        fclose($fp);
    }
}

$ini = new ini();
$ini->read("C:\\php.ini");
$ini->set('PHP', 'engine', 'Off');
echo $ini->get('PHP', 'engine');
$ini->write("C:\\php.ini");

【讨论】:

  • 谢谢。你知道我怎样才能让评论/空白正则表达式也包含新行(比如空的新行)吗?
  • ps:我正在使用你的正则表达式来“记录”像 cmets 这样的额外数据,然后我将其添加到 zend config 类生成的配置中,这太酷了 :)
  • @Alex:我在评论正则表达式中忘记了一个问号,这应该使“冒号后跟任何内容”是可选的。它是如何工作的?
【解决方案4】:

PEAR::Config 包支持 cmets,所以我认为它确实保留了它们。可能它符合您的需求。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 2015-04-27
    • 2015-03-08
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多