更改.ini文件中键值的最佳方法是什么?

时间:2011-07-02 02:43:21

标签: php regex file equals ini

我有一项任务要完成,而且我一直在尝试使用正则表达式几个小时无济于事。一点帮助和一些教学将不胜感激。 .ini文件格式为:

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

我的日常工作的目标是

  1. 获取需要更改的密钥
  2. 弄清楚该键的当前值是什么,
  3. 添加一些关于旧值以及更改者的评论,
  4. 更改值。
  5. 因此,例如,如果我想将属于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,那么我的正则表达式与TOKEN中的EN相匹配,并且还会改变它,但会弄乱整个文件:

    TOK#Changed by ....
    

    所以,有几个问题:

    1. 因为每个KEY都应该是唯一的,我是否应该使用正则表达式呢?我应该使用更快/更清洁/更好的方法吗?

    2. 为什么当我在^的行上向正则表达式添加preg_replace时,这与行的开头不匹配并摆脱我的TOKEN匹配问题?

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

1 个答案:

答案 0 :(得分:1)

您提供的信息有点模糊。这是存储在文件中吗?如果是这样,看起来你真正想要的是版本控制软件,如subversion。它将跟踪代码/ ini文件在任何时间点的状态,谁进行了更改,如果人们想要传达他们正在做什么的消息,它也会处理它。 / p>

你的正则表达式似乎有点过于复杂。对于多行搜索和替换,您需要使用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