2012-03-07 18 views
7

Necesito poder editar archivos .ini (que estoy leyendo con parse_ini_file), pero de forma tal que se conservan los comentarios y el formato (saltos de línea, sangría).Buenas clases PHP que manipulan archivos .ini

¿Conoces alguna buena clase que tenga funciones agradables y optimizadas para este tipo de cosas?

+1

¿Tiene alguna entrada y salida de muestra? –

+0

Parece un archivo ini estándar, como php.ini, 4-5 secciones con algunas entradas de clave = valor dentro de ellos – Alex

+0

Duda algo como esto existe mientras tanto (para PHP). Tendría un ['editconfigini.php'] (http://apt.include-once.org/php/), pero eso ignora las secciones y solo se preocupa por un formato restringido de clave = valor. – mario

Respuesta

4

usted podría intentar partir de esto, se lee el archivo ini, y conserva la configuración de escritura, habría que extenderlo a apoyar la adición de nuevas entradas:

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"); 
+0

gracias. ¿sabes cómo puedo hacer que el comentario/espacio en blanco expresiones regulares también incluya nuevas líneas (como líneas nuevas vacías)? – Alex

+0

pd: estoy usando tu expresión regular para "grabar" solo datos adicionales como comentarios, que luego anexaré a la configuración generada por la clase zend config, que es genial :) – Alex

+0

@Alex: Olvidé un signo de interrogación en mi comentario regex, que debería hacer que el "colon seguido de cualquier cosa" sea opcional. ¿Cómo funciona? – Martin

5

No he utilizado la config writer en el marco de componentes de Zend, pero yo he utilizado el lector de configuración, y fue muy confiable. Sin duda valdría la pena ir.

+0

Lo probé y es realmente genial, pero el escritor no conservará los comentarios, solo generará una nueva estructura ini :( – Alex

+0

Si ese es el único problema, ¿podría quizás piratear esa función? Por supuesto sería genial si tal un cambio podría encontrar su camino de regreso a la versión de código abierto, aunque solo sea para que pueda aprovechar sus actualizaciones, pero supongo que depende de la política de Zend con respecto a la estabilidad característica/API. – halfer

+0

O bien, podría subclasificar la clase de escritor Zend con tu propia clase, que contiene los cambios de comentarios. – halfer

2

El paquete PEAR::Config tiene soporte para comentarios , entonces supongo que los preserva. Probablemente se ajuste a tus necesidades.

Cuestiones relacionadas