用regexp模拟php数组语言构造或解析?

用regexp模拟php数组语言构造或解析?,php,regex,parsing,Php,Regex,Parsing,从外部来源我得到的字符串如下 array(1,2,3) 还有一个更大的数组,比如 array("a", "b", "c", array("1", "2", array("A", "B")), array("3", "4"), "d") 我需要它们成为php中的实际数组。我知道我可以使用eval,但由于它是不可信的来源,我宁愿不这样做。我也无法控制外部来源 我应该使用一些正则表达式(如果是,是什么)还是有其他方法?我认为您应该使用。也许我以后会写一个脚本,实际上就是这样做的。你可以做: jso

从外部来源我得到的字符串如下

array(1,2,3)
还有一个更大的数组,比如

array("a", "b", "c", array("1", "2", array("A", "B")), array("3", "4"), "d")
我需要它们成为php中的实际数组。我知道我可以使用eval,但由于它是不可信的来源,我宁愿不这样做。我也无法控制外部来源


我应该使用一些正则表达式(如果是,是什么)还是有其他方法?

我认为您应该使用。也许我以后会写一个脚本,实际上就是这样做的。

你可以做:

json_decode(str_replace(array('array(', ')'), array('[', ']'), $string)));
用方括号替换阵列。然后
json\u解码
。如果字符串只是一个包含标量值的多维数组,那么执行
str\u replace
不会破坏任何内容,您可以
json\u解码它。如果它包含任何代码,它还将替换函数括号,然后Json将无效,并返回
NULL

当然,这是一个相当,嗯,创造性的方法,但可能对你有用


编辑:另外,请参阅评论,了解其他用户指出的一些进一步限制

在使用标记器编写解析器时,我想到了另一个想法:为什么不使用
eval
解析数组,但首先验证它是否包含有害内容

因此,代码的作用是:它根据一些允许的令牌和字符检查数组的令牌,然后执行eval。我确实希望我包括了所有可能的无害代币,如果没有,只需添加它们即可。(我故意不包括herdeoc和NOWDOC,因为我认为它们不太可能被使用。)

将引发异常:

Disallowed token 'T_STRING' encountered.

您的外部源代码给您一个类似“array(1,2,3)”的字符串,您想将该文本转换为php数组吗?这将是。。。这不是PHP识别的序列化格式。你能控制外部源代码吗?可以让他们生成JSON或XML吗?@jonathan:是的,我想把它放在PHP数组中(就像你用eval()得到的一样)但是出于安全原因,我不想使用eval。@KennyTM:我对外部源没有任何控制权,所以我必须使用它。我现在无法测试它,但如果它正确返回,这是一个优雅的解决方案+1@KennyTM是的,那不管用。尽管如此,我还是会把它放在那里,这样OP可以决定它是否有用,这是给你的仅限数组。不适用于关联数组。它很有创意,但我喜欢它,而且它可能会发挥作用。无论如何,它将是非常简单的数组。我有着相同的想法:)虽然我没有放弃使用tokeniser完全实现它的想法,但我将首先探索您的脚本,谢谢
parseArray('exec("haha -i -thought -i -was -smart")');
Disallowed token 'T_STRING' encountered.