©
This document uses PHP Chinese website manual Release
(PHP 5 >= 5.3.0, PHP 7)
parse_ini_string — Parse a configuration string
$ini
[, bool $process_sections
= false
[, int $scanner_mode
= INI_SCANNER_NORMAL
]] ) parse_ini_string() returns the settings in string
ini
in an associative array.
The structure of the ini string is the same as the php.ini's.
ini
The contents of the ini file being parsed.
process_sections
By setting the process_sections
parameter to TRUE
, you get a multidimensional array, with
the section names and settings included. The default
for process_sections
is FALSE
scanner_mode
Can either be INI_SCANNER_NORMAL
(default) or
INI_SCANNER_RAW
. If INI_SCANNER_RAW
is supplied, then option values will not be parsed.
As of PHP 5.6.1 can also be specified as INI_SCANNER_TYPED
.
In this mode boolean, null and integer types are preserved when possible.
String values "true", "on" and "yes"
are converted to TRUE
. "false", "off", "no"
and "none" are considered FALSE
. "null" is converted to NULL
in typed mode. Also, all numeric strings are converted to integer type if it is possible.
The settings are returned as an associative array on success,
and FALSE
on failure.
Note: There are reserved words which must not be used as keys for ini files. These include: null, yes, no, true, false, on, off, none. Values null, off, no and false result in "", and values on, yes and true result in "1", unless
INI_SCANNER_TYPED
mode is used. Characters ?{}|&~![()^" must not be used anywhere in the key and have a special meaning in the value.
[#1] Peter Baylies [2013-10-31 19:34:18]
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' ) ) {
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;
}
}
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 );
}
}
?>
[#2] epicmaxim at gmail dot com [2013-04-04 07:51:56]
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] == "[" && $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) && 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]) && !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
)
)
)