我正在尝试使用 CodeIgniter 构建一个小型 CMS,并且我需要能够动态更新 application/config.php 中的一些变量
到目前为止,我做了:
private function update_file ($file, $var, $var_name) {
$start_tag = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
if (file_exists($file)) {
require_once ($file);
$updated_array = array_merge($$var_name, $var);
$data = $start_tag."\$".$var_name." = ".var_export($updated_array, true).";";
file_put_contents($file, $data);
} else {
return false;
}
}
一切正常!config.php 文件中的结果将是:
<?php ...;
$config = array (
'base_url' => '',
...
...
);
但是,如果我想使用注释、空格和
分隔声明的 $config['key'] = 'value' ... 来维护原始 config.php 文件格式怎么办?
那可能吗 ?
编辑:
谢谢你的回答,非常珍贵。我找到了一个稍微不同的解决方案来满足我的需求,在 file_get_contents() 返回时执行 preg_replace,然后在文件上写回新的结果字符串。文件保持准确的原始干净格式。
private function update_file ($file, $var, $var_name) {
if (file_exists($file)) {
require_once ($file);
$contents = file_get_contents($file);
$updated_array = array_merge($$var_name, $var);
$search = array();
$replace = array();
foreach($$var_name as $key => $val) {
$pattern = '/\$'.$var_name.'\[\\\''.$key.'\\\'\]\s+=\s+[^\;]+/';
$replace_string = "\$".$var_name."['".$key."'] = ".var_export($updated_array[$key], true);
array_push($search, $pattern);
array_push($replace, $replace_string);
}
$new_contents = preg_replace($search, $replace, $contents);
write_file($file, $new_contents);
}
也许它需要一些轻微的性能改进。但这是我的基本想法。