PHP 8.4.1 Released!

parse_ini_string

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

parse_ini_stringAnalysiert einen Konfigurations-String

Beschreibung

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

parse_ini_string() Gibt die Konfiguration aus dem String ini_string in einem assoziativen Array zurück.

Die Struktur des ini-Strings ist die selbe wie die der php.ini

Parameter-Liste

ini_string

Der Inhalt der ini-Datei die analysiert wird.

process_sections

Ist der Parameter process_sections als true gesetzt, werden Sie ein mehrdimensionales Array zurückbekommen, welches die Abschnitte und Einstellungen enthält. Die Standardeinstellung process_sections ist false

scanner_mode

Kann entweder INI_SCANNER_NORMAL (normal) oder INI_SCANNER_RAW sein. Wenn INI_SCANNER_RAW angegeben ist, werden optionale Inhalte nicht analysiert.

Seit PHP 5.6.1 kann auch INI_SCANNER_TYPED angegeben werden. In diesem Modus werden soweit möglich die Typen von Boolean-, Null- oder Integer-Werten beibehalten. Die Zeichenketten "true", "on" und "yes" werden zu true konvertiert. "false", "off", "no" und "none" werden als false angesehen. "null" wird in diesem Modus zu null. Soweit möglich werden alle numerischen Zeichenketten zu Integertypen umgewandelt.

Rückgabewerte

Die Einstellungen werden als assoziatives Array bei Erfolg, und false bei einem Fehler zurückgegeben..

Anmerkungen

Hinweis: Es gibt reservierte Wörter die nicht als Keys für die ini-Dateien benutzt werden dürfen. Dies schließt null, yes, no, true, false, on, off und none ein. Die Werte null, off, no und false geben "" zurück, und die Werte on, yes und true "1", es sei denn der INI_SCANNER_TYPED-Modus wird verwendet. Die Buchstaben ?{}|&~![()^" dürfen nirgendwo inm Key benutzt werden und haben eine spezielle Bedeutung.

Siehe auch

add a note

User Contributed Notes 4 notes

up
24
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
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
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',
),
)
*/
up
0
Philo
10 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.
To Top