如何在 php 文件中用 <?php ?> 替换大括号?
How can I replace braces with <?php ?> in php file?
我想在扩展名为 php 的文件中用 <?php ?>
替换大括号。
我有一个 class 作为库,在这个 class 中我有如下三个函数:
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
在包含文件<?
中显示为<!--?
并进行注释。为什么?
这是如何工作的:
process.php:
<?php
$contents = file_get_contents('php://stdin');
$contents = preg_replace('/\{([a-zA-Z_][a-zA-Z_0-9]*)\}/', '<?php echo $; ?>', $contents);
echo $contents;
bash 脚本:
process.php < my_file.php
请注意,上面的工作是通过一次性搜索和替换来实现的。如果您想即时执行此操作,您可以轻松修改脚本。
另请注意,从 PHP 代码中修改 PHP 代码不是一个好主意。自修改代码会导致难以发现的错误,并且通常与恶意软件相关联。如果您解释您要实现的目标 - 您的目的 - 您可能会得到更好的回应。
你在这里尝试做的事情是行不通的。输出缓冲回调执行的替换发生在 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 试一试。
这样做:
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;
}
并忽略其他两个函数。
我想在扩展名为 php 的文件中用 <?php ?>
替换大括号。
我有一个 class 作为库,在这个 class 中我有如下三个函数:
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
在包含文件<?
中显示为<!--?
并进行注释。为什么?
这是如何工作的:
process.php:
<?php
$contents = file_get_contents('php://stdin');
$contents = preg_replace('/\{([a-zA-Z_][a-zA-Z_0-9]*)\}/', '<?php echo $; ?>', $contents);
echo $contents;
bash 脚本:
process.php < my_file.php
请注意,上面的工作是通过一次性搜索和替换来实现的。如果您想即时执行此操作,您可以轻松修改脚本。
另请注意,从 PHP 代码中修改 PHP 代码不是一个好主意。自修改代码会导致难以发现的错误,并且通常与恶意软件相关联。如果您解释您要实现的目标 - 您的目的 - 您可能会得到更好的回应。
你在这里尝试做的事情是行不通的。输出缓冲回调执行的替换发生在 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 试一试。
这样做:
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;
}
并忽略其他两个函数。