我有这个字符串
$s = 'Yo be [diggin = array("fruit"=> "apple")] scriptzors!';
然后由
检查$matches = null;
preg_match_all('/\[(.*?)\]/', $s, $matches);
var_dump($matches[1]);
但我想要它做的是以下,它应该返回以下
print "yo be";
$this->diggin(SEND ARRAY HERE);
print "scriptzors!";
编辑以显示以下答案的问题
$s = 'Yo be [diggin = array("fruit"=>"apple")] scriptzors!';
$matches = null;
preg_match_all('/\[(.*?)\]/', $s, $matches);
$var = explode(' = ', $matches[1]);
print $var[0]; //THIS DOES NOT PRINT
答案 0 :(得分:0)
你很亲密。您可以使用=
explode
字符串,但=
周围包含空格。然后第一个元素是函数名称,在这种情况下是diggin
,第二个元素是数组但是作为字符串。你需要eval
那个,以便它是一个合适的数组数据类型。
$var = explode(' = ', $matches[1][0]);
call_user_func_array(array($this, $var[0]), eval($var[1] . ';'));
// or do
$this->{var[0]}(eval($val[1] . ';'));
作为替代方案,您还可以修改正则表达式,这样就不必调用explode
。
preg_match_all('/\[([a-z0-9_]*)\s*?=\s*(.*)\]/i', $s, $matches);
答案 1 :(得分:0)
这将调用该函数而不使用eval并将自己暴露给代码注入。
preg_match_all('/\[([a-z0-9_]*)\s*?=\s*array\((.*)*\)\]/i', $s, $matches);
$var = explode(',', $matches[2][0]);
$result = array();
foreach ($var as $value) {
$keyvaluepair = explode('=>', $value);
$result[$keyvaluepair[0]] = $keyvaluepair[1];
}
$this->{var[0]}($result);