采用包含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(),但我不确定哪种最简单。这个脚本只会在本地运行,所以对安全问题的担忧和get_defined_vars()不适用(我认为?)

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

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"
有帮助吗?

解决方案

如果它来自可靠来源,您可以使用(戏剧性暂停) 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

其他提示

正则表达式很容易。并且它不会关心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];
}

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

$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);
}

它必须是$ 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.

视情况而定, 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时,请注意搜索和替换参数可以使用值数组来搜索和替换。

您可以使用 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中使用的标识符匹配。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top