php中的模板字符串替换

php中的模板字符串替换,php,arrays,string,replace,eval,Php,Arrays,String,Replace,Eval,我正在尝试构建一个系统,在这个系统中,我可以基于模板创建一个文件。 模板存储在DB中,我用表单发送的数据填充模板 我尝试过这样做,但我无法使用阵列。它总是给我错误 <?php $string = "test"; $text = "This is a text for testing"; $rplc_string = '{$string}'; $rplc_text = '{$text}'; $tpl = '<html><head><title>{$s

我正在尝试构建一个系统,在这个系统中,我可以基于模板创建一个文件。 模板存储在DB中,我用表单发送的数据填充模板

我尝试过这样做,但我无法使用阵列。它总是给我错误

<?php

$string = "test";
$text = "This is a text for testing";

$rplc_string = '{$string}';
$rplc_text = '{$text}';

$tpl = '<html><head><title>{$string}</title></head><body><h1>{$string}</h1><p>{$text}</p><ul><?php foreach($array as $key => $value): ?><li><?php echo $key; ?></li><?php endforeach; ?></ul></body></html>';

$tpl = preg_replace($rplc_string, $string, $tpl);
$tpl = preg_replace($rplc_text, $text, $tpl);

$array = array( 'one' => '1', 'two' => '2', 'three' => '3' );

ob_start();
eval('?>' . $tpl);
$output = ob_get_clean();

echo $output;

?>

有更好的方法吗?

代码中有几个错误。首先,您认为变量将在单引号之间进行解释。这是假的。变量只能在双引号之间或使用heredoc语法进行解释


第二个错误也是语法错误。编写正则表达式模式时,需要添加分隔符。但是,由于您已经忘记了它们,因此花括号被视为模式分隔符,而不是文字字符。

在定义$tpl时,将双引号替换为单引号

preg_replace的第一个参数也需要是正则表达式:

<?php

$string = 'test';
$text = 'This is a text for testing';

$rplc_string = '/{\$string}/';
$rplc_text = '/{\$text}/';


$tpl = '<html><head><title>{$string}</title></head><body><h1>{$string}</h1><p>{$text}</p><ul><?php foreach($array as $key => $value): ?><li><?php echo $key; ?></li><?php endforeach; ?></ul></body></html>';

$array = array( 'one' => '1', 'two' => '2', 'three' => '3' );

$tpl = preg_replace($rplc_string, $string, $tpl);
$tpl = preg_replace($rplc_text, $text, $tpl);

ob_start();
eval('?>' . $tpl);
$output = ob_get_clean();

echo $output;

?>

它起作用了。唯一的问题是数组。我的目标是将数组传递给eval,但我没有做到这一点。这只是一个测试代码,用于获取我需要的地方并在实际代码中实现。@user3718566:如果你知道问题所在,为什么要寻求帮助?要清楚的是,您的代码格式不好,没有任何意义。你需要从一开始就重新思考你的方法。因为我认为有更好的方法来做这件事,只是我没有达到目的,这就是为什么我要寻求帮助,在隧道的尽头有一点光亮。@user3718566:如果你需要更多的帮助,请发布您对示例字符串的期望值。目标是使用表单中的数据填充$string和$text,并在模板中使用数组(从DB中提取的数据)创建插入数据的新文件。更大的问题是,为什么要重新发明轮子?有很多健壮的模板系统,它们可能比你们一起破解的更好地为你们服务。他们还将提供一个很好的机会来学习如何设计这样的模板系统。首先使用eval是一个非常糟糕的主意。@MikeBrant这不是一个模板系统。我试图做的和你使用电子邮件模板时做的一样,该模板将填充来自用户的数据,就像你将用用户名替换$to_user,用用户电子邮件替换$to_email一样。还有许多电子邮件模板库/引擎不依赖于eval。你基本上是在要求有人劫持你的系统。我编辑了这个来修复preg_replace的问题