У меня есть задача, которую я хочу выполнить, и я часами пытался с регулярным выражением, но безрезультатно.Небольшая помощь и некоторое обучение будут оценены.Формат файла .ini:
ES=Spanish
EN=English
TOKEN=Token
FILES=Files
Цель моей процедуры -
- Получить ключ, который необходимо изменить,
- Выяснить, чтотекущее значение этого ключа:
- добавить несколько комментариев о старом значении и о том, кто его изменил,
- изменить значение.
Так, например,если я хочу изменить значение, принадлежащее 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 ....
Итак, несколько вопросов:
Поскольку каждый КЛЮЧ должен быть уникальным, должен ли я даже использовать для этого регулярное выражение?Есть ли более быстрый / чистый / лучший метод, который я должен использовать?
Почему, когда я добавляю ^
к регулярному выражению в строке с preg_replace
, это не соответствуетначало строки и избавиться от моей проблемы соответствия TOKEN?
preg_replace('~^'.$key.'\s?=[^\n$]+~iu',$newEntry,$content)