Как заменить конкретное значение в жестко запрограммированном массиве внутри php-файла? - PullRequest
0 голосов
/ 26 августа 2018

Я использую файл config.php, который возвращает массив.Перед выпуском проекта я обычно вручную изменяю значение apiKey, которое я использую при разработке файла.Я иногда забываю выполнить эту замену, поэтому я ищу программный способ найти это в строковой версии файла:

'apiKey' => '1234567890'

и заменить на это:

'apiKey' => 'YourAPIKeyHere'

Значение * 1007 для разработки *, пробелы, табуляции и форматирование несовместимы (специфично для разработчика / IDE), поэтому я предполагаю, что для этого есть символы подстановки?

Тогда я могу просто внести изменения в свой сценарий развертывания.

Правка для отображения образца файла config.php (который будет считан в строку, отредактирован, а затем переписан в виде файла).

<?php
return array(
// Comments with instruction exist throughout the file. They must remain.
'apiKey' => 'ecuhi3647325fdv23tjVncweuYtYTv532r3',
...
);

Правка: ** Есть инструкциив файле config.php, который должен остаться.Поэтому переписывание измененного массива приведет к потере комментариев, а это нежелательно.

Ответы [ 5 ]

0 голосов
/ 27 августа 2018

Сохраните текст файла конфигурации в переменной с именем $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

0 голосов
/ 26 августа 2018

Я решил проблему, прочитав файл в массив и заменив строку на '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 - это то, чего я просто не понимаю, и есть другие проблемы, которые необходимо решить сейчас.

Вдохновлен всеми, кто помог.

Отзывы приветствуются.

0 голосов
/ 26 августа 2018

Я предполагаю, что у вас есть файл конфигурации, такой как;

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() функцию, прежде чем релиз проекта

0 голосов
/ 26 августа 2018

Как я и предполагал, вы можете использовать функции расширения токенайзера 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 на новый.и сохранить изменения в новом пути ...

0 голосов
/ 26 августа 2018

Вы можете использовать этот простой RegEx для сопоставления любой строки, содержащей ключ между апострофами:

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

[^']+ найдет один или несколько символов в одинарных кавычках.Просто замените на новую линию. Редактировать: Ваша строка замены будет просто:

'apiKey' => 'EnterYourAPIKeyHere' 
...