0

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

$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;
}

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

这工作正常,但我想改进它,以便它可以为类似的东西创建嵌套数组

$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 大师,所以有人可以帮我让函数理解嵌套的 [] 分隔符吗?此外,任何可以提高功能性能的东西都受到高度赞赏,因为我经常使用它来轻松地将选项传递给我的控制器。

4

2 回答 2

1

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

一些选项:

  • urlencoding 这样做
  • json
  • 亚姆
  • php的序列化()

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

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

于 2012-07-11T12:33:11.580 回答
0

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

于 2012-07-11T12:34:42.057 回答