8

获取一些包含 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"
4

6 回答 6

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];
}
于 2008-11-12T07:17:26.360 回答
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
于 2008-11-12T08:39:58.347 回答
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);
}
于 2008-11-12T07:17:23.053 回答
2

它必须是$pet吗?可以<?= $pet ?>代替吗?因为如果是这样,只需使用包含。这就是 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.
于 2008-11-12T21:46:39.443 回答
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 时,请注意搜索和替换参数可以使用值数组来搜索和替换。

于 2008-11-12T07:23:18.873 回答
-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 中使用的标识符相匹配。

于 2008-11-12T21:53:02.130 回答