0

我有这个字符串

$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
4

2 回答 2

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);

无论哪种方式,您都需要确保清理用户输入,因为eval可能是ev il

于 2012-09-23T09:41:17.673 回答
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);
于 2013-04-10T12:08:10.493 回答