Каков наилучший способ изменить значение ключа в файле .ini? - PullRequest
1 голос
/ 02 июля 2011

У меня есть задача, которую я хочу выполнить, и я часами пытался с регулярным выражением, но безрезультатно.Небольшая помощь и некоторое обучение будут оценены.Формат файла .ini:

ES=Spanish
EN=English
TOKEN=Token
FILES=Files

Цель моей процедуры -

  1. Получить ключ, который необходимо изменить,
  2. Выяснить, чтотекущее значение этого ключа:
  3. добавить несколько комментариев о старом значении и о том, кто его изменил,
  4. изменить значение.

Так, например,если я хочу изменить значение, принадлежащее EN, с английского на Eigo, я получу:

ES=Spanish
#Changed by Jane Doe on <date>
#Old value: EN=English
EN=Eigo
TOKEN=Token
FILES=Files

Мой код:

        $content = "EN=English\n"
            . "ES=Spanish\n"
            . "TOKEN=Token\n"
            . "FILES=Files\n";

            $key = 'EN';
            $newValue = 'Eigo";
            $editor = 'Jane Doe';

             //get the old value
    $matches = array();
    preg_match('~'.$key.'\s?=[^\n$]+~iu',$content,$matches);

    $commentLines = '# Change by ' . $editor . ' on ' . date("m/d/Y g:i a") . "\n";
    $commentLines .= '# Old value: ' . $matches[0] . "\n";
    $newValueLine = $key.'='.$newValue. "\n";
    $newEntry = $commentLines . $newValueLine;
    $content = preg_replace('~'.$key.'\s?=[^\n$]+~iu',$newEntry,$content);

Это работало нормально, пока я не понял,что если кто-то изменил ключ для короткой строки, такой как EN, то мое регулярное выражение соответствует EN в TOKEN, а также изменит это, но испортит весь файл:

TOK#Changed by ....

Итак, несколько вопросов:

  1. Поскольку каждый КЛЮЧ должен быть уникальным, должен ли я даже использовать для этого регулярное выражение?Есть ли более быстрый / чистый / лучший метод, который я должен использовать?

  2. Почему, когда я добавляю ^ к регулярному выражению в строке с preg_replace, это не соответствуетначало строки и избавиться от моей проблемы соответствия TOKEN?

    preg_replace('~^'.$key.'\s?=[^\n$]+~iu',$newEntry,$content)
    

1 Ответ

1 голос
/ 02 июля 2011

Информация, которую вы предоставляете, немного расплывчата. Это хранится в файле? Если это так, то похоже, что вам действительно нужно программное обеспечение для контроля версий, такое как Subversion. Он будет следить за состоянием файлов кода / ini в любой момент времени, кто внес изменение, и если люди захотят добавить сообщение о том, что они делали, он также с этим справится.

Ваше регулярное выражение кажется немного сложным. А для многострочного поиска и замены вам необходимо использовать модификатор m.

Попытка:

$key = 'EN';
preg_replace('~^'.$key.'=.*$~m', $newEntry, $content);

Проверено на http://www.spaweditor.com/scripts/regex/index.php с:

Regex: 
    /^EN=.*$/m

Data:
    EN=English
    ES=Spanish
    TOKEN=Token
    FILES=Files

Replace: 
    FOO=bar

Function:
    preg_replace

Result:
    FOO=bar
    ES=Spanish
    TOKEN=Token
    FILES=Files
...