【问题标题】:Replace [diggin] with HTML code or PHP code将 [diggin] 替换为 HTML 代码或 PHP 代码
【发布时间】:2012-09-23 09:12:56
【问题描述】:

我有这个字符串

$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

【问题讨论】:

  • 返回部分对我来说很奇怪。你的 $s 字符串应该转换成什么?
  • 它只是来自我们数据库的文本,我希望我们的员工能够在网站内容中购买插件或运行功能。像 wordpress 一样思考
  • 这是什么 "$this->diggin(SEND ARRAY HERE);"做?转换后的输出是什么样的?

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


【解决方案1】:

你有点接近。您可以使用=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 可以是evil

【讨论】:

  • 请问如何让它放在正确的部分?这确实将 {} 转换为函数,但是如何拆分 $s 中的内容,以便将函数插入到 {} 所在的位置
  • 您应该为您在字符串中找到的每个“函数调用”拆分$s 的内容。当你得到所有东西(即所有函数都被调用)后,重新构造你之前拆分的字符串。
  • 由于某种原因它没有得到 $var[0]
  • 我已编辑我的答案以显示答案问题。也许我做错了
  • 啊,我的错。右边是$var = explode(' = ', $matches[1][0]);
【解决方案2】:

这将在不使用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多