2011-07-02 91 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,那麼我的正則表達式匹配EN中的TOKEN,並且也改變了這種情況,但是弄亂了整個文件:

TOK#Changed by .... 

所以,有幾個問題:

  1. 由於每個鍵應該是唯一的,我應該甚至可以使用正則表達式的呢?我應該使用更快/更清潔/更好的方法嗎?

  2. 爲什麼當我將^添加到與preg_replace一致的正則表達式中時,這不匹配行的開始並擺脫我的TOKEN匹配問題?

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

回答

1

你給的信息是有點模糊。這是否存儲在一個文件?如果是這樣,看起來你真正想要的是版本控制軟件,如顛覆。它會跟蹤代碼/ 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 
+0

這的確是從一個文件來,但它正在通過Ajax的Web界面進行編輯。 – key2starz

+0

我建議讓跟蹤部分與ini文件分開。您可以在單獨的文件或數據庫中執行此操作。如果你不這樣做,你最終只會爲大量的信息加載一個大文件。我提供的正則表達式將用於搜索和替換部分。 – evan

相關問題