PHP:使用嵌套数组将字符串解析为数组?

时间:2012-07-11 12:30:08

标签: php arrays string parsing nested

我有以下代码将字符串解析为选项数组:

$options = 'myvalue, test=123, myarray=[1,2]';

function parse_options($options)
{
    $split = '/,(?=[^\]]*(?:\[|$))/';

    if($options && is_string($options)) 
    {
        $temp_options = preg_split($split, $options);
        $options = array();
        foreach($temp_options as $option) 
        {
            $option = trim($option);
            if(strpos($option,'=')) 
            {
                //Is an option with a value
                list($key, $value) = explode('=',$option);
                if(strpos($value,'[') !== FALSE) 
                {
                    //Is an array of values
                    $value = explode(',', substr($value, 1,-1));
                }
                $options[$key] = $value;
            }
            else 
            {
                $options[] = $option;
            }
        }
    }
    else 
    { 
        //Return empty array if not a string or is false
        if(!is_array($options)) { $options = array(); }
    }

    return $options;
}

除非用括号括起,否则它基本上用逗号分隔。然后它检查= for key->值对,然后尝试确定该值是否为数组。

这很好用,但我想改进它,以便它可以为

之类的东西创建嵌套数组
$options = 'myvalue, test=123, bigwhopper=[ myarray=[1,2], test2=something ]';

哪个会输出

Array(
    [0] => myvalue,
    [test] => 123,
    [bigwhopper] => Array(
                [myarray] = Array(
                     [0] => 1,
                     [1] => 2
                ),
                [test] => something
            )
)

我当然不是RegExp大师所以有人可以帮助我让函数理解嵌套的[]分隔符吗?还有一些提高函数性能的方法非常受欢迎,因为我用了很多东西来轻松传递我的控制器的选项。

2 个答案:

答案 0 :(得分:1)

为什么要发明自己的格式,而不是已经广泛建立的格式。

一些选项:

  • urlencoding执行此操作
  • JS​​ON
  • yalm
  • php的序列化()

你正在发明一种全新的语法,标准的正则表达式甚至不允许这样,因为它有递归。你基本上需要编写一个解析器,所以如果你坚持自己的语法,最好的起点就是查看解析器生成器。

http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php/

答案 1 :(得分:0)

不要通过为您的选项创建一个新的(不完整的,错误的和慢的)解析器来重新发明轮子。使用预先存在的解决方案:

  • 序列化
  • getopt
  • JS​​ON