我正在尝试用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
答案 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。