如何替换 php 文件内硬编码数组中的特定值?

How to replace a specific value in a hard-coded array inside of a php file?

我使用 config.php 文件,returns 数组。在发布项目之前,我通常会手动更改文件中开发时使用的 '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 文件中的说明性注释。所以重写修改后的数组会丢失注释,这是不可取的。

您可以使用这个简单的 RegEx 来匹配在撇号之间包含键的任何行:

'apiKey' => '[^']+'

[^']+ 将查找单引号之间的一个或多个字符。 只需替换为您的新行即可。 编辑: 您的替换字符串将只是:

'apiKey' => 'EnterYourAPIKeyHere' 

我假设您有一个配置文件,例如;

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() 功能

正如我所建议的,您可以使用 PHP 分词器扩展函数来实现您的目的

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

此函数接受参数配置路径,标记内容然后搜索并用新的替换旧的 apiKey 并将更改保存在新路径中...

我通过将文件读入数组并将行替换为 '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 是我不熟悉的东西,现在还有其他问题需要解决。

受到所有帮助过的人的启发。

感谢反馈。

将配置文件的文本保存在名为 $content.

的变量中

然后调用:

 $content = preg_replace("~'apiKey'\s*=>\s*'\K[^']+~", 'YourAPIKeyHere', $content, 1);

然后用更新后的变量覆盖文件。

http://php.net/manual/en/function.preg-replace.php

\s*表示匹配零个或多个空白字符。

\K表示从该点重新开始比赛。

[^']+表示匹配一个或多个非单引号字符。

Regex101 Demo

PHP Demo