2011-07-02 28 views
1

私は達成すべき課題があります。私は時間をかけて正規表現で無駄にしようとしています。少しの助けといくつかの教えは高く評価されます。 .iniファイルの形式は次のとおりです。.iniファイルのキー値を変更する最適な方法は何ですか?

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

私のルーチンの目標は

  1. にあるそのキーの現在の値が何であるかを
  2. 図アウト、変更する必要があるキーを取得し、
  3. 古い値とそれを変更した人のコメントを追加してください。
  4. 値を変更してください。

私はえいごで英語からENに属する値を変更したいのであれば、例えば、私はで終わるでしょう:

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. 、私もこのために正規表現を使用すべきですか?私が使用すべきより速い/クリーナー/より良い方法がありますか?

  2. preg_replaceの行の正規表現に^を追加すると、なぜこれが行頭に一致せず、TOKENの一致問題を解決できないのですか?

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

答えて

1

あなたが与える情報は少しあいまいです。これはファイルに保存されていますか?もしそうなら、あなたが本当に望んでいるのは、Subversionのようなバージョン管理ソフトウェアです。これは、コード/ iniファイルの状態がどの時点でどのようなものであったか、誰が変更を加えたのかを把握し、人々が何をしているのかメッセージを伝えたい場合にも対応します。

あなたの正規表現は少し複雑すぎるようです。また、複数行の検索と置換のためには、m修飾子を使用する必要があります。

してみますとhttp://www.spaweditor.com/scripts/regex/index.phpで試験

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

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 
+0

それは実際にファイルから来ているが、それは、Ajaxウェブインタフェースを介して編集されています。 – key2starz

+0

追跡部分をiniファイルとは別に保存することをお勧めします。これは、別のファイルまたはデータベースで行うことができます。そうしなければ、最終的にはほんの数枚の情報のために大きなファイルがロードされます。私が提供した正規表現は検索と置換のために機能します。 – evan

関連する問題