0

我正在尝试将文件中字符串的多个部分替换为file_put_contents. 本质上,该函数所做的是在文件中找到一个特定的短语(在$newand$old数组中并替换它。

$file_path = "hello.txt";
$file_string = file_get_contents($file_path);
function replace_string_in_file($replace_old, $replace_new) {
    global $file_string; global $file_path;
    if(is_array($replace_old)) {
        for($i = 0; $i < count($replace_old); $i++) {
            $replace = str_replace($replace_old[$i], $replace_new[$i], $file_string);
            file_put_contents($file_path, $replace); // overwrite
        }
    }
}
$old = array("hello8", "hello9"); // what to look for
$new = array("hello0", "hello3"); // what to replace with
replace_string_in_file($old, $new);

hello.txt 是:hello8 hello1 hello2 hello9

不幸的是它输出:hello8 hello1 hello2 hello3

因此,当它应该输出 2 时,它只输出 1 更改: hello0 hello1 hello2 hello3

4

2 回答 2

4

那是一个文件,为什么每次替换后都要输出呢?您的工作流程应该是

a) read in file
b) do all replacements
c) write out modified file

换句话说,将你的 file_put_contents() 移到你的循环之外。

同样,str_replace 将接受其“todo”和“replacewith”数组的数组。无需遍历您的输入。所以基本上你应该有

$old = array(...);
$new = array(...);

$text = file_get_contents(...);
$modified = str_replace($old, $new, $text);
file_put_contents($modified, ....);

您的主要问题是您编写的 str_replace 从未使用更新的字符串。您经常为每次替换使用相同的 ORIGINAL 字符串,

$replace = str_replace($replace_old[$i], $replace_new[$i], $file_string); 
                                                            ^^^^^^^^^^^---should be $replace
于 2012-09-05T18:30:15.097 回答
0

您不会在每次迭代时更新 $file_string 。即,您在循环开始时设置一次,替换第一对,然后第二次调用 replace 再次使用原始 $file_string。

于 2012-09-05T18:30:20.107 回答