用HTML代码或PHP代码替换[diggin]

时间:2012-09-23 09:12:56

标签: php preg-replace preg-match preg-match-all

我有这个字符串

$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

2 个答案:

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

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

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