我使用config.php文件返回一个数组。在发布项目之前,我通常会手动更改在文件中开发时使用的“ apiKey”值。我有时会忘记执行替换操作,因此我正在寻找一种编程方式来在文件的字符串版本中找到它:
'apiKey' => '1234567890'
并替换为:
'apiKey' => 'YourAPIKeyHere'
开发apiKey
的值,空格,制表符和格式不一致(特定于Developer / IDE),所以我想有通配符吗?
然后我可以在部署脚本中进行更改。
编辑以显示config.php示例(将其读取为字符串,进行编辑,然后将其重写为文件)。
<?php
return array(
// Comments with instruction exist throughout the file. They must remain.
'apiKey' => 'ecuhi3647325fdv23tjVncweuYtYTv532r3',
...
);
编辑:** config.php文件中有必须保留的说明性注释。因此,重写修改后的数组将丢失注释,这是不希望的。
答案 0 :(得分:1)
我假设您有一个配置文件,例如;
return [
'dbname' = 'project',
'username' = 'root',
'password' = '123456',
.
.
.
'apiKey' => '1234567890',
]
因此,您可以制作一个小助手方法,然后才能使用它来发布项目。
function reset_config()
{
$file_path = "your/config/path";
$configs = require_once($file_path);
array_walk_recursive($configs, function (&$config, $key) {
$config = "your " . $key;
});
$string = var_export($configs,true);
$new_config_file = <<<HEAD
<?php
return $string;
HEAD;
file_put_contents($file_path, $new_config_file);
}
所以在发布项目之前您需要使用reset_config()
函数
答案 1 :(得分:1)
将配置文件的文本保存在名为$content
的变量中。
然后致电:
$content = preg_replace("~'apiKey'\s*=>\s*'\K[^']+~", 'YourAPIKeyHere', $content, 1);
然后用更新的变量覆盖文件。
http://php.net/manual/en/function.preg-replace.php
\s*
表示匹配零个或多个空格字符。
\K
意味着从这一点重新开始比赛。
[^']+
表示匹配一个或多个非单引号字符。
答案 2 :(得分:0)
您可以使用此简单的RegEx来匹配单引号之间包含键的任何行:
'apiKey' => '[^']+'
[^']+
将在单引号之间找到一个或多个字符。
只需替换为您的新行。
编辑:
您的替换字符串就是:
'apiKey' => 'EnterYourAPIKeyHere'
答案 3 :(得分:0)
正如我建议的那样,您可以使用PHP tokenizer扩展功能来实现您的目的
function replaceApiKey($configpath,$newKey='test',$newpath=''){
if(file_exists($configpath)&&is_readable($configpath)&&is_file($configpath))
$string = file_get_contents($configpath);
else
return false;
$tokens=token_get_all($string);
$start=false;
foreach($tokens as $key=>$token){
if(is_array($token)&&stripos($token[1],'apiKey')){
$start=true;
$tokens[$key]=$token[1];
continue;
}
if($start&&$token&&is_array($token)&&token_name($token[0])!=="T_COMMENT"&&token_name($token[0])!=="T_DOUBLE_ARROW"&&!ctype_space($token[1])){
$token[1]=$token[1][0].$newKey.$token[1][strlen($token[1])-1];
$start=false;
}
if(is_array($token)) $tokens[$key]=$token[1];
}
if(empty($newpath))
$newpath=$configpath;
if (file_put_contents($newpath, join('',$tokens)))
return true;
else
return false;}
此函数采用参数config路径,对内容进行标记,然后搜索并用新的apiKey替换旧的apiKey并将更改保存在新路径中...
答案 4 :(得分:0)
我通过将文件读入数组并将行替换为'apiKey'解决了该问题:
$array = file('app/config.php');
$string = "";
for($i = 0, $maxi = count($array); $i < $maxi; $i++)
{
if(strpos($array[$i],'apiKey')>0){
$string.=" 'apiKey' => 'YourAppAPIKeyHere',\r\n\r\n";
}else{
$string.=$array[$i];
}
}
这可能不是最优雅的解决方案,但它可以工作。直到有人没有正确格式化其代码。由于这个原因,我仍然想使用RegEx将替换替换为所需的模式。但是RegEx是我不喜欢的东西,现在还有其他问题需要解决。
受到所有帮助的人的启发。
感谢反馈。