0

如何使字符串充当代码?

例如,我希望将此字符串解析为数组,

$config = '
    "allowable_tags" => "<p>",
    "span_regex" => null, 
    "allow_nbsp" => true, 
    "allow_class" => false
';

所以,

function tidy($config = null){

    $default = array(
        "allowable_tags" => null,
        "span_regex" => null, 
        "allow_nbsp" => true, 
        "allow_class" => false
    );

    $config = array($config);

    # Loop the array.
    foreach($default as $key => $value)
    {
        # Set the variable.
        $$key = set_variable($config,$key)? set_variable($config,$key):$value;
    }

    return $allowable_tags;
}


var_dump(tidy($config));

然后我会得到这个结果,

<p>

可行吗?

依赖函数,

function set_variable($array = array(),$key,$params = array())
{
    # If $params is not an array, let's make it array with one value of former $params.
    if(!is_array($params)) $params = array($params);
    if(!is_array($array)) parse_str($array, $array);

    # When you want a variable to return a boolean, this will return true or false.
    if(in_array('boolean', $params)) return isset($array[$key]) && $array[$key] === true ? true : false;

    # This will regard '0' as a string.
    # Return value or 0 as a string.
    elseif(in_array('zero_to_string', $params)) return isset($array[$key]) && ($array[$key] == '0') ? trim($array[$key]) : null;

    # Return null as string if 'null_to_string' is set.
    elseif(in_array('null_to_string', $params)) return isset($array[$key]) && !empty($array[$key]) ? trim($array[$key]) : 'null';

    # Check if the key is an array.
    elseif(isset($array[$key]) && !empty($array[$key]) && is_array($array[$key])) return isset($array[$key]) && !empty($array[$key]) ? $array[$key] : null;

    # This will regard '0', empty space as falsey.
    # Return value or null.
    else return isset($array[$key]) && !empty($array[$key]) ? trim($array[$key]) : null;
}
4

3 回答 3

2

与其制作自定义函数来将配置变量的字符串表示解析为数组,为什么不直接使用 JSON 等现有格式呢?然后你可以简单地调用json_decode()并取回一个数组。此外,如果这是针对用户提交/输入的配置值,则JSON广为人知,易于学习且有些安全,因为不执行任何代码。

于 2012-04-11T20:30:03.907 回答
2

首先,您如何获得该字符串?

我猜你正在将配置存储在数据库或其他东西中。在这种情况下,您应该使用 PHP 内置方法的序列化。

<?php

// normal PHP array
$config = array(
    "allowable_tags" => "<p>",
    "span_regex" => null, 
    "allow_nbsp" => true, 
    "allow_class" => false
);

// array serialized as string
$string = serialize($config);

echo $string ."\n\n";
# => a:4:{s:14:"allowable_tags";s:3:"<p>";s:10:"span_regex";N;s:10:"allow_nbsp";b:1;s:11:"allow_class";b:0;}

// converting serialized string back to array
$array = unserialize($string);

print_r($array);
/*
    Array
    (
        [allowable_tags] => <p>
        [span_regex] => 
        [allow_nbsp] => 1
        [allow_class] => 
    )
*/

看到它在ideone上工作


编辑

正如乔纳森库恩所建议的那样,json_encode()json_decode()非常适合处理这个问题。

于 2012-04-11T20:30:30.593 回答
-1

我不认为这是理想的,但它是一些基础:

function str2array($str)
{
    $array = explode(',', $str);
    $rArray = array();
    foreach ($array as $items) {
        $i = explode('=>', $items);
        if (preg_match('/^"*(.*?)"$/', trim($i[1]), $iWithoutQuotes)) {
            $i[1] = $iWithoutQuotes[1];
        }
        $rArray[substr(trim($i[0]), 1, -1)] = trim($i[1]);
    }

    return $rArray;
}
于 2012-04-11T20:32:26.817 回答