我有以下代码将字符串解析为选项数组:
$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大师所以有人可以帮助我让函数理解嵌套的[]分隔符吗?还有一些提高函数性能的方法非常受欢迎,因为我用了很多东西来轻松传递我的控制器的选项。
答案 0 :(得分:1)
为什么要发明自己的格式,而不是已经广泛建立的格式。
一些选项:
你正在发明一种全新的语法,标准的正则表达式甚至不允许这样,因为它有递归。你基本上需要编写一个解析器,所以如果你坚持自己的语法,最好的起点就是查看解析器生成器。
http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php/
答案 1 :(得分:0)
不要通过为您的选项创建一个新的(不完整的,错误的和慢的)解析器来重新发明轮子。使用预先存在的解决方案: