0

我正在寻找使用 PHP 打开一个文件(参见下面的示例),逐行搜索字符串$colour并替换"="with之后的所有内容$value

file.txt 之前:

red=0
green=23
blue=999
yellow=44

如果我$value"1"并且我的颜色是"blue",我的文件应该更改为:

red=0
green=23
blue=1
yellow=44

到目前为止,我的代码是:

function write($colour, $value) {
    $file = 'path';
    $file_contents = file_get_contents($file);
    $file_contents = str_replace($colour, $value, $file_contents);
    file_put_contents($file, $file_contents);
}

然而,这只是$colour$value(不是“=”之后的所有内容)替换我的输出:

red=0
green=23
1=999
yellow=44

我该怎么做呢?谢谢!

4

2 回答 2

1

问题是您只是将颜色的文本替换为中的值

$file_contents = str_replace($colour, $value, $file_contents);

不过,这并不能取代整行。

使用preg_replace(),您可以替换以颜色开头的内容,然后=用...替换直到行尾。

$file_contents = preg_replace("/{$colour}=.*/", "{$colour}={$value}", $file_contents);
于 2020-07-21T18:05:32.753 回答
1

发生这种情况是因为您的代码仅将颜色替换为指定的值。为此,您必须逐行加载文件,按 = 分解以分别具有颜色和值,再次调整和存储。或者使用正则表达式。

我想提出不同的方法。而不是对作为字符串加载的文件进行操作,而是将文件作为数组加载。为此有一个函数:parse_ini_file。

<?php

// load the file to array with elements key => value
$data = parse_ini_file('conf.txt');

var_dump($data);

// change the data in array however you want - here i add 1 to red everytime this script is called, but it can be whatever: $data['red'] = 2; or similar
$data['red']++;

// now just build the contents of the file again and save it
$contents = '';
foreach ($data as $key => $value) {
  $contents .= $key.'='.$value.PHP_EOL;
}

file_put_contents('conf.txt', $contents);

结果:

// this is how the file looks like at start
cat conf.txt 
red=0
green=23
blue=1
yellow=44

// this is how $data looks
array(4) {
  ["red"]=>
  string(1) "0"
  ["green"]=>
  string(2) "23"
  ["blue"]=>
  string(1) "1"
  ["yellow"]=>
  string(2) "44"
}

// and the file after the execution
cat conf.txt 
red=1
green=23
blue=1
yellow=44

更改$data['red']++;$data[$color] = $value;将其放入函数中,仅此而已。

于 2020-07-21T18:09:41.697 回答