如何让字符串充当代码?
例如,我希望将此字符串解析为数组
$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;
}
答案 0 :(得分:2)
而不是使用自定义函数将配置变量的字符串表示形式解析为数组,为什么不使用现有格式(如JSON)?然后你可以简单地调用json_decode()并获得一个数组。此外,如果这是用户提交/输入的配置值,JSON是众所周知的,易于学习且有些安全,因为没有执行代码。
答案 1 :(得分: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] =>
)
*/
正如Jonathan Kuhn所建议的那样,json_encode()
和json_decode()
也非常适合处理此问题。
答案 2 :(得分:-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;
}