用DB数据替换文件中的“键”

时间:2009-03-12 01:08:48

标签: php

目前,我有以下方法从我的数据库中检索数据:

$school->get('studentCount');

我需要一个快捷方式来访问页面中的这些字段,因此想出了这样的格式:

<p>Blah blah blah [[studentCount]]</p>

我打开了输出缓冲,但只需要一个简单的方法来替换该键('[[field-name]]')及其来自数据库的相应数据。

如果它只是一个字段,我可以在输出上执行str_replace,如下所示:

str_replace($output, '[[studentCount]]', $school->get('studentCount'))

不幸的是,这不合适。我理想的解决方案会抓住'[['和']]'之间的任何内容,然后运行'get'方法并用返回的内容替换整个键('[[...]]')。

6 个答案:

答案 0 :(得分:2)

您可以创建两个数组,一个包含字段名称字符串[[field-name]],另一个包含响应$school->get('field-name')。然后将它们放在str_replace中,因为它支持数组。

PHP手册中的示例:

$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);
// Resulting String: "You should eat pizza, beer, and ice cream every day."

如果您仍想实施您的建议(找到所有[[]]并替换它们),我会尝试编写快速功能。

修改:以下是通过您的请求执行此操作的两种方法:

$html = "Hello, [[FirstName]]!  Welcome to [[SiteName]].";
$count = preg_match_all("/\[\[([\w]+)\]\]/", $html, $matches);
for ($x = 0; $x < $count; $x++)
  $html = str_replace($matches[0][$x], $school->get($matches[1][$x]), $html);

或者使用数组:

$html = "Hello, [[FirstName]]!  Welcome to [[SiteName]].";
$count = preg_match_all("/\[\[([\w]+)\]\]/", $html, $matches);
for ($x = 0; $x < $count; $x++)
  $matches[1][$x] = $school->get($matches[1][$x]);
$html = str_replace($matches[0], $matches[1], $html);

答案 1 :(得分:2)

我很确定这会奏效。 :)


<?php
// $output contains the string

preg_match_all('/\[{2}([^\[]+)\]{2}/', $output, $matches);
$replaces = $matches['1'];

foreach($replaces as $replace) $str = str_replace('[['.$replace.']]', $school->get($replace), $output);
?>

答案 2 :(得分:1)

您将需要使用正则表达式来查找两个[[和]]中的内容,并将插入的内容插入到您的 - &gt; get()函数中。

功能将是preg_replace

http://us2.php.net/preg-replace

答案 3 :(得分:1)

假设您可以缓存结果,正则表达式和文件缓存是一种很好的方法。首先转换文件:

function cache_it($filename, $tablvar) {
    $tmplt = file_get_contents($filename);
    $tmplt = preg_replace('/\[\[(.+)\]\]/', 
             '<?php echo $' . $tablevar . '->get(\1);?>',
             $tmplt);
    file_put_contents($filename . '.php', $tmplt);
}

然后,只要您需要访问该文件。

function print_it($filename, $tablevar, $table) {
    $_GLOBAL[$tablevar] = $table;
    include $filename . '.php';
    unset($_GLOBAL[$tablevar]);
}

您可能想要检查缓存文件的创建日期是否大于源文件的上次修改日期。在课堂上包含上述两个函数有助于避免许多小陷阱。但总的想法是合理的。缓存文件也存在一些安全问题,这些问题是您需要解决的.php文件。

我将此样式模板缓存添加到我正在处理的OSS CMS中。通过缓存正则表达式结果,我们将原始代码加速了50%以上。真正的好处是模板是PHP文件。因此,加速解释PHP文件(APC,eAccelerator等)的任何事情都会加速你的模板。

答案 4 :(得分:0)

您需要编写一个解析器来查看$ output以查找分隔符之间的内容,然后调用函数(如果已定义)。 我假设您希望这样做以保存呼叫,直到需要它们。 我写了一个模板解析器,有效地以这种方式工作。不幸的是,它不是在PHP中。

答案 5 :(得分:0)

感谢目前为止的回复。我确实考虑过将str / preg _replace与数组一起使用,但我希望键('[[...]]')直接与'get'方法相结合,因此它是完全可扩展的。每次向DB添加新字段时,我都不想添加两个不同的数组。

在JavaScript中,例如,我会这样实现:( JavaScript允许您将匿名函数作为'replacement'参数传递给它的preg_replace):

('this is the output blah blah [[studentCount]]').replace(/\[{2}([^\[]+)\]{2}/g, function($0, $1) {
    get($1);
})