Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用HTML代码或PHP代码替换[diggin]_Php_Preg Replace_Preg Match_Preg Match All - Fatal编程技术网

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

用HTML代码或PHP代码替换[diggin],php,preg-replace,preg-match,preg-match-all,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_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

你有点接近了。您可以使用
=
标记字符串,但在
=
周围包含空格。然后第一个元素将是函数名,在本例中为
diggin
,第二个元素将是数组,但作为字符串。您将需要修改它,使其成为正确的数组数据类型

$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
可以执行。

这将调用函数,而无需使用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);

返回部分对我来说很奇怪。你的$s字符串应该转换成什么?它只是文本,来自我们的数据库,我想让我们的工作人员在网站内容中添加插件或运行功能。想象一下WordPress这个“$this->diggin(在这里发送数组);”做什么?您的输出在转换时是什么样子的?我可以问一下如何将其放入正确的部分吗?这会将{}转换为函数,但是如何拆分$s中的内容,以便将函数插入到{}所在的位置呢?您应该为字符串中找到的每个“函数调用”拆分
$s
的内容。当你得到了所有东西(即调用了所有函数)后,重新构造之前分割的字符串。由于某些原因,它没有得到$var[0],我编辑了我的答案,以显示带有答案的问题。也许我做错了啊,我的错。右边是
$var=explode('=',$matches[1][0])