使用PHP替换纯文本变量的最佳方法

时间:2008-11-12 07:08:36

标签: php variables substitution

采用包含PHP样式变量的纯文本(不是PHP代码),然后替换变量值的最佳方法是什么。这有点难以描述,所以这是一个例子。

// -- myFile.txt --
Mary had a little $pet.

// -- parser.php --
$pet = "lamb";
// open myFile.txt and transform it such that...
$newContents = "Mary had a little lamb.";

我一直在考虑使用正则表达式或eval(),但我不确定哪种最简单。这个脚本只会在本地运行,所以对安全问题和eval()的任何担忧都不适用(我认为?)

我还要补充一点,我可以使用get_defined_vars()将所有必要的变量放入数组中:

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"

6 个答案:

答案 0 :(得分:11)

正则表达式很容易。它并不关心eval()会考虑语法错误的事情。

这是找到PHP样式变量名称的模式。

\$\w+

我可能会采用这种通用模式并使用PHP数组查找我找到的每个匹配项(使用(preg_replace_callback())。这样正则表达式只需要应用一次,这在长期运行。

$allVars = get_defined_vars();
$file = file_get_contents('myFile.txt');

// unsure if you have to use single or double backslashes here for PHP to understand
preg_replace_callback ('/\$(\w+)/', "find_replacements", $file);

// replace callback function
function find_replacements($match)
{
  global $allVars;
  if (array_key_exists($match[1], $allVars))
    return $allVars[$match[1]];
  else
    return $match[0];
}

答案 1 :(得分:5)

如果它来自可靠的来源,你可以使用(戏剧性停顿)eval()(来自观众的恐怖气息)。

$text = 'this is a $test'; // single quotes to simulate getting it from a file
$test = 'banana';
$text = eval('return "' . addslashes($text) . '";');
echo $text; // this is a banana

答案 2 :(得分:2)

这是我刚刚提出的,但我仍然有兴趣知道是否有更好的方法。欢呼声。

$allVars = get_defined_vars();
$file = file_get_contents('myFile.txt');

foreach ($allVars as $var => $val) {
    $file = preg_replace("@\\$" . $var . "([^a-zA-Z_0-9\x7f-\xff]|$)@", $val . "\\1", $file);
}

答案 3 :(得分:2)

它必须是$ pet吗?可能是<?= $pet ?>吗?因为如果是这样,只需使用include。这就是php作为模板引擎的整个想法。

//myFile.txt
Mary had a little <?= $pet ?>.

//parser.php

$pet = "lamb";
ob_start();
include("myFile.txt");
$contents = ob_end_clean();

echo $contents;

这将呼应:

Mary had a little lamb.

答案 4 :(得分:0)

根据具体情况,str_replace可能会解决问题。

示例:

// -- myFile.txt --
Mary had a little %pet%.

// -- parser.php --
$pet = "lamb";
$fileName = myFile.txt

$currentContents = file_get_contents($fileName);

$newContents = str_replace('%pet%', $pet, $currentContents);

// $newContents == 'Mary had a little lamb.'

当您查看str_replace时,请注意搜索和替换参数可以使用值数组来搜索和替换。

答案 5 :(得分:-1)

您可以使用strtr

$text = file_get_contents('/path/to/myFile.txt'); // "Mary had a little $pet."
$allVars = get_defined_vars(); // array('pet' => 'lamb');
$translate = array();

foreach ($allVars as $key => $value) {
    $translate['$' . $key] = $value; // prepend '$' to vars to match text
}

// translate is now array('$pet' => 'lamb');

$text = strtr($text, $translate);

echo $text; // "Mary had a little lamb."

您可能希望在get_defined_vars()中进行前置,因此不要将变量循环两次。或者更好的是,只需确保您分配的任何键最初与您在myFile.txt中使用的标识符匹配。