Хорошие классы PHP, которые манипулируют файлами .ini - PullRequest
7 голосов
/ 07 марта 2012

Мне нужно иметь возможность редактировать файлы .ini (которые я читаю с помощью parse_ini_file), но таким образом, чтобы комментарии и форматирование (разрывы строк, отступы) сохранялись.

Знаете ли вы какие-нибудь хорошие классы с хорошими и оптимизированными функциями для такого рода вещей?

Ответы [ 4 ]

5 голосов
/ 11 марта 2012

Я не использовал конфигуратор в инфраструктуре компонентов Zend, но я использовал программу чтения конфигурации, и она была очень надежной.Конечно, стоило бы пойти.

4 голосов
/ 12 марта 2012

Вы можете попробовать начать с этого, он читает 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");
2 голосов
/ 13 марта 2012

Пакет PEAR::Config поддерживает комментарии, поэтому я предполагаю, что они сохраняются.Вероятно, это соответствует вашим потребностям.

2 голосов
/ 11 марта 2012
...