【问题标题】:What's the best way to change a key value in an .ini file?更改 .ini 文件中的键值的最佳方法是什么?
【发布时间】:2011-09-27 03:24:33
【问题描述】:

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

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

我的日常目标是

  1. 获取需要更改的密钥,
  2. 找出该键的当前值是多少,
  3. 添加一些关于旧值和更改者的 cmets,
  4. 更改值。

因此,例如,如果我想将属于 EN 的值从 English 更改为 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)
    

【问题讨论】:

    标签: php regex file equals ini


    【解决方案1】:

    您提供的信息有点模糊。这是存储在文件中吗?如果是这样,您似乎真正想要的是版本控制软件,例如 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
    

    【讨论】:

    • 它确实来自一个文件,但它正在通过 ajax Web 界面进行编辑。
    • 我建议将跟踪部分与 ini 文件分开。您可以在单独的文件或数据库中执行此操作。如果不这样做,您最终将加载一个仅包含几条信息的巨大文件。我提供的正则表达式将适用于搜索和替换部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2012-01-03
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多