用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])代码>