ob_start(function($c) use (&$online){
$replacements = array(
"online"=> $online
);
return preg_replace_callback("/{(\w+)}/",function($m) use ($replacements) {
return isset($replacements[$m[1]]) ? $replacements[$m[1]] : $m[0];
},$c);
});
上面的ob_start()代码是我几年前得到的一个函数。我试图找出如何修改它以实现目标或使用不同的方法来做到这一点。
我有一个编辑器,我希望用户能够键入{%data_1%}
,并在ob_start()或其他方法获取时回显<?php $data['data_1']; ?>
。如果_1
更改为_2
,它将回显<?php echo $data['data_2']
。我知道我可以在那里添加每一个,但是我希望有一种方法可以设置1个东西并且它自动在{%data_#%} = <?php echo $data['data_#']; ?>
我不想为每一个预定义。数据项介于1到20之间,我不希望在代码中包含这些数据,因为我可能会在将来增加它等等。所以我想要的是{%data_*%}
它改变了行代码到<?php echo $data['data_*]; ?>
并将数字放在替换代码中的*位置。每个人都会自动生成该代码,并且该号码将被替换。我需要它来做这件事,因为我想用ob_start做其他事情太相似了。我最终会有一个很好的项目列表被替换,我不想管理列表
用菜单做同样的事情... {%menu_#%}
将被替换为<?php echo menu($_data['data_#']) ?>
因此输出代码需要能够被更改..但它需要自动识别#和抓住它。甚至不确定这是否真的可能。
如果可能的话,它需要得到第一件事(数据/菜单)并使用_作为分隔符,然后得到数字(现在为1-20),并且基本上传播新代码。如果首先是数据 - &gt;插入<?php echo data['data_#']; ?>
,如果第一件事是菜单,请插入<?php echo menu($_data['data_#']
答案 0 :(得分:1)
这是你想要做的吗?
<?php
$data = array("data_1" => "Data Number 1", "data_2" => "Data Number 2");
ob_start(function($buffer) use (&$data){
$pattern = "/{%(data_.*?)%}/";
preg_match_all($pattern, $buffer, $output);
$return = "";
foreach($output[1] as $dataitem){
$return .= $data[$dataitem]."\n";
}
return $return;
});
?>
{%data_1%}
{%data_2%}
<?php
ob_end_flush();
?>
根据以下评论,这是我认为您想要做的第二个版本:
<?php
ob_start(function($buffer){
$buffer = preg_replace("/{%(data_.*?)%}/", '<?php echo $data[\'$1\']; ?>', $buffer);
$buffer = preg_replace("/{%menu_#(.*?)%}/", '<?php echo menu($_data[\'data_$1\']); ?>', $buffer);
return $buffer;
});
?>
{%data_1%}
{%menu_#2%}
{%data_2%}
<?php
ob_end_flush();
?>
答案 1 :(得分:0)
在过去的几天里,我发现使用ob_start()返回php代码只能通过eval()完成,并且它有点不安全的代码,因为它让你打开php注入。所以,我已经过渡并学习了如何编写模板引擎并使用.tpl文件,这样用户就无法将自己的php代码放入页面,所有内容都可以使用函数在后台运行的php页面进行处理。这使我无法使用eval()代码,因为我拒绝使用另一个SO用户。
因为我无法删除这个问题因为它有答案,所以我想告诉所有看过这个问题的人我学到了什么,并建议使用模板引擎&amp;功能,避免使用我在我的问题中建议的方法。
感谢@Mohammad Reza与我合作解决可能的解决方案。