【发布时间】:2011-09-27 03:24:33
【问题描述】:
我有一项任务要完成,我已经尝试使用正则表达式数小时无济于事。一点帮助和一些教学将不胜感激。 .ini 文件格式为:
ES=Spanish
EN=English
TOKEN=Token
FILES=Files
我的日常目标是
- 获取需要更改的密钥,
- 找出该键的当前值是多少,
- 添加一些关于旧值和更改者的 cmets,
- 更改值。
因此,例如,如果我想将属于 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 ....
所以,有几个问题:
因为每个 KEY 都应该是唯一的,我是否应该为此使用正则表达式?我应该使用更快/更清洁/更好的方法吗?
-
为什么当我在带有
preg_replace的行上的正则表达式中添加^时,这不匹配行的开头并摆脱我的TOKEN 匹配问题?preg_replace('~^'.$key.'\s?=[^\n$]+~iu',$newEntry,$content)
【问题讨论】: