parse_ini_string

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

parse_ini_stringAnaliza una cadena de configuración

Descripción

parse_ini_string(string $ini, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array

parse_ini_string() devuelve las configuraciones de la cadena ini a una matriz asociativa.

La estructura de la cadena ini es la misma que la de php.ini.

Parámetros

ini

El contenido del archivo ini que va a ser analizado.

process_sections

Al establecer el parámetro process_sections a true, se obtiene una matriz multidimesional, con los nombres de las secciones y las configuraciones incluidas. El valor por defecto de process_sections es false

scanner_mode

Puede ser o INI_SCANNER_NORMAL (por defecto) o INI_SCANNER_RAW. Si INI_SCANNER_RAW es proporcionado, los valores de las opciones no serán analizadas.

A partir de PHP 5.6.1 también se puede especificar como INI_SCANNER_TYPED. En este modo, los tipos boolean, null e integer se preservan siempre que sea posible. Los valores de string "true", "on" y "yes" son convertidos a true. "false", "off", "no" y "none" se consideran como false. "null" se convierte a null en el modo tipificado. También, todos los string numéricos son convertidos al tipo integer fuera es posible.

Valores devueltos

Las configuraciones son devueltas como un array asociativo si se tiene éxito, y false si falla.

Notas

Nota: Hay palabras reservadas que no se deben usar como claves en los ficheros ini. Éstas incluyen: null, yes, no, true, false, on, off, none. Los valores null, off, no y false resultan en "", y los valores on, yes and true resultan en "1", a menos que se utilice el modo INI_SCANNER_TYPED. Los caracteres ?{}|&~![()^" no se deben usar en ningún lugar de la clave y tienen un significado especial en el valor.

Ver también

add a note add a note

User Contributed Notes 4 notes

up
26
epicmaxim at gmail dot com
11 years ago
parse_ini_string_m is analog for a parse_ini_string function.

had to code this function due to the lack of a php 5.3 on some hosting.

parse_ini_string_m:
- ignores commented lines that start with ";" or "#"
- ignores broken lines that do not have "="
- supports array values and array value keys

<?php
function parse_ini_string_m($str) {
   
    if(empty(
$str)) return false;

   
$lines = explode("\n", $str);
   
$ret = Array();
   
$inside_section = false;

    foreach(
$lines as $line) {
       
       
$line = trim($line);

        if(!
$line || $line[0] == "#" || $line[0] == ";") continue;
       
        if(
$line[0] == "[" &amp;&amp; $endIdx = strpos($line, "]")){
           
$inside_section = substr($line, 1, $endIdx-1);
            continue;
        }

        if(!
strpos($line, '=')) continue;

       
$tmp = explode("=", $line, 2);

        if(
$inside_section) {
           
           
$key = rtrim($tmp[0]);
           
$value = ltrim($tmp[1]);

            if(
preg_match("/^\".*\"$/", $value) || preg_match("/^'.*'$/", $value)) {
               
$value = mb_substr($value, 1, mb_strlen($value) - 2);
            }

           
$t = preg_match("^\[(.*?)\]^", $key, $matches);
            if(!empty(
$matches) &amp;&amp; isset($matches[0])) {

               
$arr_name = preg_replace('#\[(.*?)\]#is', '', $key);

                if(!isset(
$ret[$inside_section][$arr_name]) || !is_array($ret[$inside_section][$arr_name])) {
                   
$ret[$inside_section][$arr_name] = array();
                }

                if(isset(
$matches[1]) &amp;&amp; !empty($matches[1])) {
                   
$ret[$inside_section][$arr_name][$matches[1]] = $value;
                } else {
                   
$ret[$inside_section][$arr_name][] = $value;
                }

            } else {
               
$ret[$inside_section][trim($tmp[0])] = $value;
            }           

        } else {
           
           
$ret[trim($tmp[0])] = ltrim($tmp[1]);

        }
    }
    return
$ret;
}
?>

example usage:

<?php
$ini
= '

    [simple]
    val_one = "some value"
    val_two = 567

    [array]
    val_arr[] = "arr_elem_one"
    val_arr[] = "arr_elem_two"
    val_arr[] = "arr_elem_three"

    [array_keys]
    val_arr_two[6] = "key_6"
    val_arr_two[some_key] = "some_key_value"

'
;

$arr = parse_ini_string_m($ini);
?>

variable $arr output:

Array
(
    [simple] => Array
    (
        [val_one] => some value
        [val_two] => 567
    )

    [array] => Array
    (
        [val_arr] => Array
        (
            [0] => arr_elem_one
            [1] => arr_elem_two
            [2] => arr_elem_three
        )
    )

    [array_keys] => Array
    (
        [val_arr_two] => Array
        (
            [6] => key_6
            [some_key] => some_key_value
        )

    )

)
up
2
Peter Baylies
11 years ago
Replacement for php_ini_string() for PHP pre 5.3 - uses php_ini_file() and streams

<?php
if ( !function_exists( 'parse_ini_string' ) ) {
    function
parse_ini_string( $string, $process_sections ) {
        if ( !
class_exists( 'parse_ini_filter' ) ) {
           
/* Define our filter class */
           
class parse_ini_filter extends php_user_filter {
                static
$buf = '';
                function
filter( $in, $out, &$consumed, $closing ) {
                   
$bucket = stream_bucket_new( fopen('php://memory', 'wb'), self::$buf );
                   
stream_bucket_append( $out, $bucket );
                    return
PSFS_PASS_ON;
                }
            }
           
/* Register our filter with PHP */
           
stream_filter_register("parse_ini", "parse_ini_filter")
            or return
false;
        }
       
parse_ini_filter::$buf = $string;
        return
parse_ini_file( "php://filter/read=parse_ini/resource=php://memory", $process_sections );
    }
}
?>
up
0
Philo
11 months ago
Hi,
Up to PHP 8.3 (at least), it seems that INI_SCANNER_TYPED is ignored when trying to get values from constants.
For example :
<?php
// https://3v4l.org/qK5o8

const OK = true;
const
KO = false;
const
NIL = null;

$ini = <<<'INI'
a = TRUE
b = FALSE
c = null
d = 9223372036854775807
INI;
var_dump(parse_ini_string($ini, false, INI_SCANNER_NORMAL), parse_ini_string($ini, false, INI_SCANNER_TYPED));
$ini = <<<'INI'
a = OK
b = KO
c = NIL
d = PHP_INT_MAX
INI;
var_dump(parse_ini_string($ini, false, INI_SCANNER_NORMAL), parse_ini_string($ini, false, INI_SCANNER_TYPED));
?>

I thought it was worth mentioning.
up
1
msegit post pl
6 years ago
With function parse_ini_stringM() below you can:
- fix unvalued fields ('key' (invalid) ==> 'key=' (OK) )
- fix unquotted values with equal sign '=' ('key=value_part1=value_part2' ==> 'key="value_part1=value_part2"')
- fix (solve) multidimensional arrays (makes 'key[key1][key2]=value' valid)

function parse_ini_stringM() on github https://gist.github.com/msegu/c43a871c5a874a1d9bff978b448a0aa4 (here is too long)

// Example:

$ini = '[a]
b
c=d
e=';

var_export(parse_ini_string($ini, TRUE)); /* array (
  'a' =>
  array (
    'c' => 'd',
    'e' => '',
  ),
)
*/

$ini .= '
f[g][2]=h
f[g][i]=j
f[g][][]=k
m=n=o';

var_export(parse_ini_string($ini, TRUE)); // false

var_export(parse_ini_stringM($ini, TRUE)); /* array (
  'a' =>
  array (
    'b' => '',
    'c' => 'd',
    'e' => '',
    'f' =>
    array (
      'g' =>
      array (
        2 => 'h',
        'i' => 'j',
        3 =>
        array (
          0 => 'k',
        ),
      ),
    ),
    'm' => 'n=o',
  ),
)
*/
To Top