带有str_replace的多个file_put_contents?

时间:2012-09-05 18:26:18

标签: php

我正在尝试用file_put_contents替换文件中字符串的多个部分。 本质上该函数的作用是在文件中找到一个特定的短语(位于$new$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

2 个答案:

答案 0 :(得分:4)

这是一个单独的文件,为什么要在每次更换后输出它?您的工作流程应为

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

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

同样,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

答案 1 :(得分:0)

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