PHP:使用ob_start或其他方法分离变量和传播数据

时间:2013-12-29 21:56:10

标签: php

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_#']

2 个答案:

答案 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与我合作解决可能的解决方案。