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_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array|false

parse_ini_string() devuelve la configuración en la cadena ini_string en un array asociativo.

La estructura de la cadena debe ser la misma que la del archivo php.ini.

Parámetros

ini_string

El contenido de tipo ini a analizar.

process_sections

Al activar el argumento process_sections con true, se obtendrá un array multidimensional, con los nombres de secciones y directivas. El valor por omisión del argumento process_sections es false

scanner_mode

Puede tomar los valores de las constantes INI_SCANNER_NORMAL (por omisión) o INI_SCANNER_RAW. Si INI_SCANNER_RAW es utilizado, los valores de las opciones no serán analizados.

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 directivas son devueltas en forma de array array en caso de éxito, y false en caso de error.

Notas

Nota: Existen varias palabras reservadas que no deben ser utilizadas como clave en los archivos .ini. Esto incluye: null, yes, no, true, false, on, off, none. Los valores null, off, no y false son devueltos como "" (cadena vacía) y los valores on, yes y true son devueltos como "1" a menos que el modo INI_SCANNER_TYPED sea utilizado. Los caracteres ?{}|&~![()^" no deben ser utilizados en ninguna parte en las claves, y tienen un significado especial en los valores.

Ver también

add a note

User Contributed Notes 4 notes

up
25
epicmaxim at gmail dot com
12 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
3
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
1
msegit post pl
7 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',
),
)
*/
up
0
Philo
1 year 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.
To Top