采用包含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"
答案 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中使用的标识符匹配。