• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • parse_ini_string()

    (PHP 5 >= 5.3.0, PHP 7)

    解析配置字符串

    说明

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

    parse_ini_string()返回$ini字符串解析后的关联数组

    ini 字符串的格式参考php.ini

    参数

    $ini

    ini 字符串内容

    $process_sections

    设置$process_sections参数为TRUE,得到一个多维数组,包含名称和设置。$process_sections默认为FALSE

    $scanner_mode

    可以是INI_SCANNER_NORMAL(默认)或INI_SCANNER_RAW。如果是INI_SCANNER_RAW,那么选项值不会被解析。

    As of PHP 5.6.1 can also be specified asINI_SCANNER_TYPED. In this mode boolean, null and integer types are preserved when possible. String values"true","on"and"yes"are converted toTRUE."false","off","no"and"none"are consideredFALSE."null"is converted toNULLin typed mode. Also, all numeric strings are converted to integer type if it is possible.

    返回值

    执行成功返回一个关联数组,返回FALSE为失败

    注释

    Note:保留关键字不能作为 ini 的键,包括 null, yes, no, true, false, on, off, none以及空值,off,no 和错误的结果集,值为 yes 和正确的结果集。除非使用INI_SCANNER_TYPED模式。字符?{}|&~![()^"不能在任何地方使用作为键和有特殊意义的值。

    参见

    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
        )
      )
    )
    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 );
      }
    }
    ?>
    
    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',
     ),
    )
    */

    上篇:parse_ini_file()

    下篇:pathinfo()