【问题标题】:read array from string php从字符串php读取数组
【发布时间】:2012-11-12 08:34:04
【问题描述】:

我有一个这样的字符串

$php_string = '$user["name"] = "Rahul";$user["age"] = 12;$person["name"] = "Jay";$person["age"] = 12;';

或者像这样

 $php_string = '$user = array("name"=>"Rahul","age"=>12);$person= array("name"=>"Jay","age"=>12);';

我需要从字符串中获取数组,

预期结果是

print_r($returned);

Array
(
    [name] => Rahul
    [age] => 12
)

请注意字符串中可能有其他内容,包括cmets,其他php代码等

【问题讨论】:

  • 似乎是eval() 的案例,但前提是您确定这是唯一的方法。
  • @Jack 我不想执行脚本,
  • 到目前为止你尝试过什么?
  • @xbonez 像其他人一样建议我尝试使用eval,但这有点过头了,我试图逐行读取内容,但问题是 php 有多种格式用于声明数组。 .我期待一个基于reg的..我什么都不知道..
  • @Red 字符串从何而来?变量中的代码通常只是糟糕的设计。

标签: php arrays string filter


【解决方案1】:

我不会依赖一些神奇的正则表达式,而是采用更简单的方法并使用token_get_all() 来标记字符串并创建一个非常基本的解析器,该解析器可以基于两种数组构造方法创建必要的结构。

我不认为很多人自己推出了这个,但它可能是最稳定的解决方案。

【讨论】:

    【解决方案2】:

    像这样使用evalpreg_match_all 的组合:

    if(preg_match_all('/array\s*\(.*\)/U', $php_string, $arrays)){
        foreach($arrays as $array){
            $myArray = eval("return {$array};");
            print_r($myArray);
        }
    }
    

    只要您的数组不包含),这将起作用,但可以进一步修改以处理这种情况

    或者正如杰克建议的那样使用token_get_all()

    $tokens = token_get_all($php_string);
    if(is_array($tokens)){
        foreach($tokens as $token){
            if($token[0] != T_ARRAY)continue;
            $myArray = eval("return {$token[1]};");
            print_r($myArray);
        }
    }
    

    【讨论】:

    • 但我认为eval会执行脚本,可能还有一些其他代码,所以需要基于字符串的操作。
    • 您可以优化上面的正则表达式以允许 () 它应该适合您
    • 感谢您的开始,我将尝试修改代码并发布重新定义的代码,尤其是 PHP5 的新数组方法。
    猜你喜欢
    • 2011-04-15
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多