我有一项任务要完成,而且我一直在尝试使用正则表达式几个小时无济于事。一点帮助和一些教学将不胜感激。 .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,那么我的正则表达式与TOKEN中的EN相匹配,并且还会改变它,但会弄乱整个文件:
TOK#Changed by ....
所以,有几个问题:
因为每个KEY都应该是唯一的,我是否应该使用正则表达式呢?我应该使用更快/更清洁/更好的方法吗?
为什么当我在^
的行上向正则表达式添加preg_replace
时,这与行的开头不匹配并摆脱我的TOKEN匹配问题?
preg_replace('~^'.$key.'\s?=[^\n$]+~iu',$newEntry,$content)
答案 0 :(得分:1)
您提供的信息有点模糊。这是存储在文件中吗?如果是这样,看起来你真正想要的是版本控制软件,如subversion。它将跟踪代码/ ini文件在任何时间点的状态,谁进行了更改,如果人们想要传达他们正在做什么的消息,它也会处理它。 / p>
你的正则表达式似乎有点过于复杂。对于多行搜索和替换,您需要使用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