我想在带有php扩展名的文件中用<?php ?>
替换大括号。
我有一个类作为库,在这个类中我有三个这样的函数:
function replace_left_delimeter($buffer)
{
return($this->replace_right_delimeter(str_replace("{", "<?php echo $", $buffer)));
}
function replace_right_delimeter($buffer)
{
return(str_replace("}", "; ?> ", $buffer));
}
function parser($view,$data)
{
ob_start(array($this,"replace_left_delimeter"));
include APP_DIR.DS.'view'.DS.$view.'.php';
ob_end_flush();
}
我有一个带有php扩展名的视图文件,如下所示:
{tmp} tmpstr
输出中的我只保存了tmpstr和浏览器中的源代码
<?php echo $tmp; ?>
tmpstr
在包含文件<?
显示为<!--?
并进行评论。为什么呢?
答案 0 :(得分:2)
你在这里尝试做的事情不会奏效。在已经解析并执行PHP代码之后,由输出缓冲回调执行替换。在这个阶段引入新的PHP代码标签不会导致它们被执行。
在评估之前,您需要预先处理PHP源文件,例如
$tp = file_get_contents(APP_DIR.DS.'view'.DS.$view.'.php');
$tp = str_replace("{", "<?php echo \$", $tp);
$tp = str_replace("}", "; ?>", $tp);
eval($tp);
但是,我强烈建议使用现有的模板引擎;这种方法效率低下且有限。例如,你可能想给Twig一个镜头。
答案 1 :(得分:0)
这样做:
function parser($view,$data)
{
$data=array("data"=>$data);
$template=file_get_contents(APP_DIR.DS.'view'.DS.$view.'.php');
$replace = array();
foreach ($data as $key => $value) {
#if $data is array...
$replace = array_merge(
$replace,array("{".$key."}"=>$value)
);
}
$template=strtr($template,$replace);
echo $template;
}
并忽略其他两个功能。
答案 2 :(得分:-1)
这是如何运作的:
<强> process.php 强>:
<?php
$contents = file_get_contents('php://stdin');
$contents = preg_replace('/\{([a-zA-Z_][a-zA-Z_0-9]*)\}/', '<?php echo $\1; ?>', $contents);
echo $contents;
bash脚本:
process.php < my_file.php
请注意,上述工作通过一次性搜索和替换。如果要动态执行此操作,可以轻松修改脚本。
另请注意,从PHP代码中修改PHP代码是个坏主意。自修改代码可能导致难以发现的错误,并且通常与恶意软件相关联。如果你解释你想要实现的目标 - 你的目的 - 你可能会得到更好的回应。